使用大约 2MB 内存耗尽内存

我正在与有内存问题的 php 作斗争。


脚本终止并显示以下消息: PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted (tried to allocate 3027408 bytes) in test.php on line 9


我创建了一个小测试脚本:


<?php

function 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:28


PHP: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 时,它仍然会死掉。


墨色风雨
浏览 78回答 1
1回答

白衣染霜花

看看你的memory_limit.&nbsp;错误说Allowed memory size of 2097152 bytes exhausted。哪个不是2GBconsole.log(2097152&nbsp;/&nbsp;2**20&nbsp;+&nbsp;"MB");var_dump(ini_get('memory_limit'));function memstat($file, $line) {&nbsp; &nbsp; echo sprintf(&nbsp; &nbsp; &nbsp; &nbsp; 'mem @ %s %d: %.2f MB (%.2f MB; peak: %.2f MB)' . PHP_EOL,&nbsp; &nbsp; &nbsp; &nbsp; $file,&nbsp; &nbsp; &nbsp; &nbsp; $line,&nbsp; &nbsp; &nbsp; &nbsp; memory_get_usage() /2**20,&nbsp; &nbsp; &nbsp; &nbsp; memory_get_usage(true) /2**20,&nbsp; &nbsp; &nbsp; &nbsp; memory_get_peak_usage() /2**20&nbsp; &nbsp; );}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
打开App,查看更多内容
随时随地看视频慕课网APP