5

我正在尝试增加某些 PHP 脚本的允许内存。无论我做什么,例如:

ini_set('memory_limit', '512M');

...脚本总是在 300MB 左右耗尽内存:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255

我已经通过几种方式验证了memory_limit实际上已经改变了。问题似乎是 PHP 无法物理分配总共 300 MB 的内存(25165824 字节 + 343810589 字节 = 352 MB)。

我已经在具有以下规格的两台不同的基于 Windows 的计算机上尝试了 PHP/5.3.0 和 PHP/5.3.9:

  • Windows XP / Windows Server 2003(两台电脑都是 32 位机器,1GB 或 RAM)
  • 官方 PHP 32 位 VC9 二进制文件
  • 作为 Apache 2.2 模块运行(第三方 32 位 VC9 二进制文件)

我知道使用一半的物理 RAM 会强制交换并减慢速度,但我只需要确保脚本确实有效,以便可以将其部署到实时服务器。我还尝试了更大的值(产生了相同的错误)和更小的值(要么使我的脚本达到限制,要么使 Apache 崩溃)。

这个明显硬编码的内存限制的来源是什么?

更新 #1:我已经对 Windows Server 2003 机器(它实际上是一个 VMWare 虚拟机)进行了进一步的测试。我已经将“物理”RAM 增加到 2 GB,并且我已经验证页面文件允许增长到 1152 MB。任务管理器显示当前事务负载为 886 MB,并且有 1.5 GB 的可用物理内存。但是,我得到了完全相同的数字相同的错误。

更新#2:正如我所说,memory_limit指令很好。它同时出现在ini_get()phpinfo()中。您收到的错误消息与我的略有不同;我的表示 PHP崩溃。请比较:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes)
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes)

我将尝试编写一个脚本来重现该问题并进行报告。

4

3 回答 3

4

OOM 异常与内存限制警告不同。

这意味着 PHP 无法实际分配内存,因为您的操作系统中可用的资源不足。

您需要检查系统是否有足够的可用内存/分页来支持这一点。

于 2012-01-31T11:21:53.120 回答
0

尝试使用 max_input_time,有时当 PHP 说memory_limit它实际上意味着max_input_time(-1 是无限的)。

于 2013-05-09T10:10:28.933 回答
0

我遇到了类似的问题,内存不足错误以低至 250MB 的数字弹出。如果您找到控制 ThreadsPerChild 的 apache 配置文件(对我来说是 /conf/extra/httpd-mpm.conf)并将 ThreadsPerChild 从 150 减少到 50 左右,您应该会看到明显的改进......这是一个脚本测试一下:

echo "Memory limit: ".ini_get("memory_limit")."<br><br>";
$a=array();
if (ob_get_level() == 0) ob_start();
for($i=0;$i<200;$i++)
{
    $a[]=str_pad('',1024*1024*32);
    echo "Pass ".$i.", memory used: ".number_format((memory_get_usage())/(1024*1024),0)." MB<br>";
    ob_flush();
    flush();
}
于 2019-06-13T20:23:24.030 回答