【问题标题】:php script hungs after consuming a large amount of memory消耗大量内存后php脚本挂起
【发布时间】:2017-02-24 12:46:17
【问题描述】:

我正在浏览器中运行一个 php 脚本。 php 脚本在消耗超过 600MB 字节后挂起。 httpd 使用 100% 的 CPU。日志文件中不会出现错误。我正在使用带有 php 5.4 的 xampp。为了简化问题,我测试了以下脚本:

<?php
set_time_limit(0);
ini_set('memory_limit', '1800M');
$b="";
for($i=0;$i<630000000;$i++)
{
     $b.='a';
}
echo "completed!";
?>

脚本失败并出现以下错误: 致命错误:内存不足(已分配 320077824)(试图分配 319815657 字节) 我的系统有大约 1.5G 内存可用。怎么会这样?

【问题讨论】:

  • 你到底想用这段代码做什么?
  • 除了在内存中创建一个 630MB 的字符串(由于它是通过连接构建的,至少需要两倍)还有什么意义?尽量保持较低的内存使用率要好得多,因为分配新内存块的开销很大
  • 检查为什么php不能从可用物理内存中分配内存
  • php如何连接字符串?如果您在 C# 中执行此操作,则不会扩展字符串值,而是会创建一个新字符串。所以旧值一直存在(占用内存),直到垃圾收集。
  • 这个错误告诉你它已经分配了320077824并试图分配一个额外的319815657,这将它推到了极限;所以内存限制设置在320077824320077824+319815657 之间的某个位置...这仍然远小于 1800MB

标签: php memory-management


【解决方案1】:

我的系统有大约 1.5G 内存可用。

当然,并非所有这些都可用于 PHP。

你需要在你的PHP配置中增加memory_limit

memory_limit 整数
这设置了允许脚本分配的最大内存量(以字节为单位)。这有助于防止编写不佳的脚本耗尽服务器上的所有可用内存。请注意,要没有内存限制,请将此指令设置为 -1。

【讨论】:

  • 很遗憾,在 php.ini 中更改 memory_limit=1500M 并不能解决这个问题。
  • 有趣的是,即使我关闭浏览器,httpd 仍然使用 100% CPU。我必须停止 apache 以使其正常。由于没有错误信息/日志,如何调试这个问题?
  • 如果浏览器关闭连接,通常脚本会中止。检查配置中的ignore_user_abort 设置。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2014-01-04
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多