为了账号安全,请及时绑定邮箱和手机立即绑定

使用大约 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 关注
  • 44 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信