我正在与有内存问题的 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 时,它仍然会死掉。
白衣染霜花