由于我的问题越来越长,我决定重新编写整个问题,使其更好、更短。
我在8GB内存的专用服务器上运行我的网站。我完全意识到我需要提高php.ini设置中的内存限制。我已将它从128M设置为256M并设置为-1。但问题仍然存在。
致命错误:内存不足(分配了786432)(尝试分配24576字节)在D:\www\football\views\main.php的第81行
内存不足没有意义,因为它说只有分配了786432字节,还需要24576字节。
786432字节只有768KB,相当小。
提示
- 错误发生在非常随机的行上。它不总是在第81行出错。
- 在高峰时期,Apache只占用大约500MB的内存。我还有6GB的剩余空间。
- 没有无限循环。
- 脚本占用1042424字节。从
echo memory_get_peak_usage();
获取此数字 - MySQL的结果集很小(最多12行,纯文本,无blob数据)
- (重要)如果每两天重新启动一次Apache,则错误会消失。通常发生在Apache运行超过2天时。
- 我已经包括了脚本分析,您可以在此处获取它here。
- 这个专用服务器纯粹用于运行一个网站。这个网站是一个高流量网站,每分钟平均有1000个访问者。在高峰期,将有1700至2000名访问者同时访问。
服务器规格
操作系统:Windows 2008 R2 64位
CPU:英特尔Core i5-4核
RAM:8 GB
Apache 2.2
PHP 5.3.1
存储:2 x 1 TB硬盘
带宽:每月10TB
解决方案
我终于成功调整和解决了问题,我想在这里分享一下我所做的改进:
favicon.ico
丢失,破坏了我的路由引擎。虽然我的路由引擎很小,但通过包含favicon.ico
,它有助于减少内存使用,避免运行我的路由引擎。我的网站大部分部分都有它,但我忘记为这个新部分放置它。限制
MaxRequestPerChild
有帮助。在我的其他专用服务器上,我有我的MaxRequestPerChild
受限。对于这台服务器,我将其设置为0。我一直认为每个脚本都是隔离的。假设我的脚本需要800KB才能运行。完成后,Apache或PHP应该释放800KB内存。似乎它不起作用。限制MaxRequestPerChild
可以通过在限制MaxRequestPerChild
之后创建新进程并使旧进程死亡来防止内存泄漏。这是我的新设置。
ThreadsPerChild 1500
MaxRequestsPerChild 10000
ob_flush();
能稍微减少一点内存占用。虽然帮助不大,但每一点优化都有所帮助。
xdebug
,这是其他回答者建议的,我从未使用过。我必须说这是个好工具,我已经优化了一些东西,让它运行得更快了。
ulimit
生效(也许是www用户或PHP脚本所有者,例如.profile)?当在Apache模块中停止工作时,您是否尝试在CLI中运行脚本?您使用任何缓存机制PHP模块吗?您使用suhosin或类似的加固模块吗? - PhilMasteG