亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用大約 2MB 內存耗盡內存

使用大約 2MB 內存耗盡內存

PHP
墨色風雨 2023-09-22 14:52:49
我正在與有內存問題的 php 作斗爭。腳本終止并顯示以下消息: PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted (tried to allocate 3027408 bytes) in test.php on line 9我創建了一個小測試腳本:<?phpfunction memstat($file, $line) {    $memlog = fopen('mem.log', "a+");    fwrite($memlog, sprintf('mem @ %s %d: %d (%d; peek: %d)'.PHP_EOL, $file, $line, memory_get_usage(), memory_get_usage(true), memory_get_peak_usage()));    fclose($memlog);}memstat(__FILE__, __LINE__);$str = str_pad('', 1523687, ' ');memstat(__FILE__, __LINE__);print 'end '.strlen($str);?>該腳本在 php 7.4 上運行不會崩潰,但是當我將 str_pad 長度參數增加到 1523688 時,它就會終止并顯示上述消息。這個腳本在php7.2上運行,當長度參數為1515495時,但當長度參數為1515496時崩潰。我在同一服務器上用php5.6測試它,運行沒有任何問題。無論我如何運行它,apache 還是 cli,腳本都會崩潰。修改ini后apache已經重新啟動,這不是問題。我用 2GB memory_limit 對其進行了測試,并且收到了相同的錯誤消息。僅當我將 memory_limit 更改為 -1 時,它才有效,但我認為這不是正確的解決方案,我的意思是,如果 512MB 對于這個小腳本來說不夠,那就有問題了。在我看來,php 在開始運行時分配了 2097152 內存,第一次嘗試分配更多系統內存時它崩潰了。在我自己的電腦上同樣的apache和php 7版本,沒有問題。環境:處理器:Intel Xeon E5-2620內存:8GB適用于:Win10專業版64位Web 服務器:Apache/2.4.29 (Win64) Apache Lounge VC11 服務器構建時間:2017 年 11 月 6 日 11:17:28PHP:7.4.8 和 7.2.32有人知道什么會導致這樣的錯誤嗎?編輯皮蘭寫了一個略有不同的劇本。我在有問題的計算機上執行了腳本,結果如下:string(3) "2GB"mem @ C:\web\test.php 15: 0.37 MB (2.00 MB; peak: 0.41 MB)Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 10000024 bytes) in C:\web\test.php on line 16正如你所看到的,內存限制是 2GB,當它嘗試分配超過 2MB 時,它仍然會死掉。
查看完整描述

1 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

看看你的memory_limit. 錯誤說Allowed memory size of 2097152 bytes exhausted。哪個不是2GB

console.log(2097152 / 2**20 + "MB");

var_dump(ini_get('memory_limit'));


function memstat($file, $line) {

    echo sprintf(

        'mem @ %s %d: %.2f MB (%.2f MB; peak: %.2f MB)' . PHP_EOL,

        $file,

        $line,

        memory_get_usage() /2**20,

        memory_get_usage(true) /2**20,

        memory_get_peak_usage() /2**20

    );

}


memstat(__FILE__, __LINE__);

$str = str_pad('', 9999999, ' ');

memstat(__FILE__, __LINE__);

print 'end '.strlen($str);

工作示例。


輸出

string(3) "64M"

mem @ /in/BHqWd 16: 0.37 MB (2.00 MB; peak: 0.41 MB)

mem @ /in/BHqWd 18: 9.91 MB (11.54 MB; peak: 9.91 MB)

end 9999999


查看完整回答
反對 回復 2023-09-22
  • 1 回答
  • 0 關注
  • 94 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號