由于我的问题越来越长,我决定重新编写整个问题以使其更好更短。
我在具有 8GB 内存的专用服务器上运行我的网站。我完全知道我需要提高 php.ini 设置的内存限制。我已将其从 128M 设置为 256M 和 -1。问题仍然是持久性。
致命错误:第 81 行 D:\www\football\views\main.php 中的内存不足(已分配 786432)(试图分配 24576 字节)
内存不足没有意义,因为它说只分配了 786432 字节,而且还需要 24576 字节。
786432 字节只有 768 KB,而且相当小。
提示
- 错误发生在非常随机的行上。它并不总是在第 81 行出错。
- 在高峰期,Apache 只占用大约 500mb 的内存。我还有 6GB 可用空间。
- 没有无限循环。
- 该脚本占用 1,042,424 个字节。从中获取此号码
echo memory_get_peak_usage();
- MySQL 的结果集很小(最多 12 行,纯文本,没有 blob 数据)
- (重要)如果我每两天重新启动一次 Apache,错误就消失了。它通常发生在 Apache 运行超过 2 天时。
- 我已经包含了分析脚本,你可以在这里得到它。
- 这个专用服务器纯粹是用来运行一个网站的。该网站是一个高流量网站,平均每分钟有 1,000 名访问者。在高峰期,将有 1,700 至 2,000 名访客同时访问。
服务器规格
操作系统:Windows 2008 R2 64 位
CPU:Intel Core i5 - 4 核
RAM:8 GB
Apache 2.2
PHP 5.3.1
存储:2 x 1 TB 硬盘
带宽:每月 10 TB
解决方案
我终于调整并解决了这个问题,我想在这里分享我为改进所做的工作:
favicon.ico
丢失了这弄乱了我的路线引擎。虽然我的路由引擎非常小,但通过包含favicon.ico
,它有助于通过不运行我的路由引擎来减少内存使用。我网站的大部分都有它,我忘了把它放在这个新部分。限制有
MaxRequestPerChild
帮助。在我的另一台专用服务器上,我有我的MaxRequestPerChild
限制。对于这个服务器,我设置为0。我一直以为每个脚本都是隔离的。假设我的脚本需要 800kb 才能运行。完成后,Apache 或 PHP 应该释放 800kb 内存。似乎它不以这种方式工作。LimitedMaxRequestPerChild
确实有助于通过在受限之后创建新进程来防止内存泄漏,MaxRequestPerChild
并且旧进程正在死亡。这是我的新设置。ThreadsPerChild 1500 MaxRequestsPerChild 10000
ob_flush();
确实减少了更多的内存。它没有多大帮助,但每一点优化都有帮助。xdebug
正如试图回答这个问题的人所建议的那样,我使用了我以前从未使用过的。我不得不说它是一个很棒的工具,我已经优化了一些东西,让它运行得更快一些。- 我禁用了一些不必要的 Apache 模块。我正在尝试一一禁用它,并对其进行几天的测试,以确保它在禁用另一个之前完美运行。我现在确实禁用了所有不必要的 PHP 扩展。
- 我在这个服务器中的大部分脚本都使用传统方式(无模板、无数据库层、纯 PHP、HTML 和遗留 mysql_* 函数)。老实说,它运行速度非常快,而且使用的内存非常小。但是,由于网站越来越长,维护脚本并不容易。我试图将网站的某些部分转换为适当的框架(我自己的小框架)。我使用自己的框架的原因是它很小(整个框架只有 3kb,只包含我需要的东西)。
- 切换到 IIS7.5 彻底解决了这个问题。