4

我在 Windows+Apache 上的 PHP 应用程序停止显示“内存不足(已分配 422313984)(试图分配 45792935 字节)”。

我不明白为什么它会停止,因为我的机器有 4GB 物理内存,并且我memory_limit在 PHP.ini 文件中为 -1 设置了指令。我还重新启动了 Apache。

我认为 4GB 足以分配超过 422313984+45792935 字节的内存。

是否有其他设置可以为 PHP 或 Apache 使用内存?

我还总结了性能计数器。它显示机器的最大内存使用量为 2GB。而httpd进程使用了​​1.3GB。

我无法显示代码,但实际上代码从 DBMS 获取 30000 行,每行 199 字节,并simplexml_load_string()在循环中使用解析为 XML。

如果数据很小或缩短循环期限(如 30000 到 1000),则代码通常已完成。

另一种情况是启动Apache后第一次运行会成功。

我认为发生了一些内存泄漏。

实际上我做了 echoPHP_INT_SIZE和 PHP 显示 4。所以也许我的 PHP 是 32 位版本。

如果内存使用问题来自这个版本的 PHP,正如 Álvaro G. Vicario 指出的那样,我可以通过更改为 64 位版本的 PHP 来解决它吗?我怎样才能获得 64 位版本的 PHP for Windows?我在http://windows.php.net中找不到它

4

1 回答 1

3

«Out of memory»消息(不要与«Allowed memory size exhausted » 消息混淆)总是表明 PHP 解释器确实内存不足。没有可以调整的 PHP 或 Apache 设置——计算机无法为 PHP 提供更多 RAM。常见原因包括:

  • 使用过多内存的脚本。
  • PHP 解释器中的内存泄漏或错误。

SimpleXML 绝不是一个轻量级的扩展。相反,它易于使用和方便的功能是有代价的:高资源消耗。即使没有看到任何一行代码,我也可以保证 SimpleXML 完全不适合创建包含 30,000 个项目的 XML 文件。使用 2GB RAM 的 PHP 脚本只能关闭整个服务器。

没有人喜欢在项目中间更改基础库,但您最终需要这样做。PHP 提供了一个名为XMLWriter的拉式解析器。它实际上并不难使用,它提供了两个好处:

有了它,我确信你的 2 GB 脚本可以用几 MB 运行。

于 2013-03-01T12:59:08.180 回答