PHP不能使用300MB的RAM

Álv*_*lez 6 php mod-php

我正在尝试为某些PHP脚本增加允许的内存.不管我做什么,例如:

ini_set('memory_limit', '512M');
Run Code Online (Sandbox Code Playgroud)

...脚本总是耗尽大约300MB的内存:

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

我通过几种方式验证了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)
Run Code Online (Sandbox Code Playgroud)

我将尝试编写一个脚本来重现问题并报告回来.

Pau*_*ain 4

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

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

您需要检查系统是否有足够的内存/分页来支持此操作。