我在 Windows+Apache 上的 PHP 应用程序停止显示“内存不足(已分配 422313984)(已尝试分配 45792935 字节)”。
我不明白为什么它会停止,因为我的机器有 4GB 物理内存并且我在 PHP.ini 文件中为 -1 设置了 memory_limit
指令。我还重新启动了 Apache。
我认为4GB足以分配超过422313984+45792935字节的内存。
PHP 或 Apache 是否有其他设置来使用内存?
我还总结了性能计数器。它显示机器的最大内存使用量为 2GB。而 httpd 进程使用了 1.3GB。
我无法显示代码,但实际上代码从 DBMS 获取 30000 行,每行 199 字节,并在循环中使用 simplexml_load_string()
解析为 XML。
如果数据比较小,或者把循环次数缩短到30000到1000,代码正常结束。
还有一种情况是Apache启动后第一次运行会成功。
我认为发生了一些内存泄漏。
实际上我确实回显了 PHP_INT_SIZE
并且 PHP 显示了 4。‖所以也许我的 PHP 是 32 位版本。
如果内存使用问题来自此版本的 PHP,如 Álvaro G. Vicario 在下面指出的那样,我可以通过更改为 64 位版本的 PHP 来修复它吗?我怎样才能获得适用于 Windows 的 64 位版本的 PHP?我在http://windows.php.net里找不到
最佳答案
«Out of memory» 消息(不要与 «Allowed memory size exhausted» 消息混淆)总是表示 PHP 解释器字面意义上的内存不足。没有可以调整的 PHP 或 Apache 设置——计算机无法为 PHP 提供更多的 RAM。常见原因包括:
- 使用过多内存的脚本。
- PHP 解释器中的内存泄漏或错误。
SimpleXML 绝不是轻量级扩展。相反,它的易用性和方便的特性是有代价的:高资源消耗。即使没有看到一行代码,我也可以保证 SimpleXML 完全不适合创建包含 30,000 项的 XML 文件。使用 2GB RAM 的 PHP 脚本只能关闭整个服务器。
没有人喜欢在项目进行到一半时更改基础库,但您最终需要这样做。 PHP 提供了一个名为 XMLWriter 的拉式解析器。 .它使用起来并不难,而且有两个好处:
- 它占用的资源较少,因为它不会创建 SimpleXML 使用的复杂对象。
- 你可以flush partial results提交。
- 甚至可以write to file directly .
有了它,我确信您的 2 GB 脚本可以用几 MB 运行。
关于php - 关于PHP的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15154203/