我正在尝试增加某些 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)
我将尝试编写一个脚本来重现该问题并进行报告。