由于我的问题越来越长,我决定重写整个问题,使其更好和更短。
我在专用服务器上运行我的网站8GB内存。我完全知道,我需要提高对php.ini设置的内存限制。我已经设置从128M到256M和-1。仍然的问题是持久性。
Fatal error: Out of memory (allocated 786432) (tried to allocate 24576
bytes) in D:\www\football\views\main.php on line 81
内存不足没有意义,因为它说只有786432字节被分配,它需要24576字节多。
786432字节只有768千字节,相当小。
提示
>错误发生在一个非常随机的行。它在第81行不总是错误。
>在高峰时间,Apache只需要大约500MB的内存。我还有6GB的空余。
>没有无限循环。
>该脚本需要1,042,424字节。从echo memory_get_peak_usage()获取此数字;
> MySQL的结果集很小(最多12行,纯文本,没有blob数据)
>(重要)如果我每两天重新启动Apache一次,错误消失了。它通常发生在Apache运行超过2天。
>我已经包括分析脚本,你可以得到它here。
>这个专用服务器纯粹用于运行一个网站。这个网站是一个高流量的网站,平均每分钟1000访客。在高峰时段,将有1,700至2,000名访客同时访问。
服务器规格
OS: Windows 2008 R2 64-Bit
CPU: Intel Core i5 – 4 cores
RAM: 8 GB
Apache 2.2
PHP 5.3.1
Storage: 2 x 1 TB hard drives
Bandwidth: 10 TB per month
解
我终于调整和解决了这个问题,我想在这里分享我做了哪些改进:
> favicon.ico失踪,弄乱了我的路线引擎。虽然我的路由引擎非常小,但通过包括favicon.ico,它有助于通过不运行我的路由引擎减少内存使用。我的网站的大部分有它,我忘了把这个新的部分。
>限制MaxRequestPerChild帮助。在我的其他专用服务器,我有我的MaxRequestPerChild有限。对于这个服务器,我将其设置为0.我一直认为每个脚本是孤立的。让我们说如果我的脚本需要800kb运行。完成后,Apache或PHP应释放800kb内存。它似乎不工作这种方式。有限的MaxRequestPerChild通过在有限的MaxRequestPerChild之后创建新进程和旧进程正在死亡帮助防止内存泄漏。这是我的新设置。
ThreadsPerChild 1500
MaxRequestsPerChild 10000
> ob_flush();确实减少了更多的内存。它不帮助很多,但每一点优化都有帮助。
>我使用xdebug,我从来没有使用过的人试图回答这个问题的建议。我不得不说它是伟大的工具,我已经优化了一些东西,使其运行稍快。
>我已禁用一些不必要的Apache模块。我试图禁用它一个一个,离开它几天测试,以确保它工作完美之前,我禁用另一个。我现在有所有不必要的PHP扩展禁用。
>我的大部分脚本在这个服务器使用传统方式(没有模板,没有数据库层,纯PHP,HTML和旧的mysql_ *函数)。说实话,它运行非常快,使用极小的内存。然而,维护脚本不是很容易,因为网站越来越长。我试图将网站的一些部分转换成适当的框架(我自己的小框架)。之所以使用我自己的框架,是因为它是微小的(整个框架的3kb,并只包括我需要的)。
>切换到IIS7.5完全解决这个问题。