我怎么知道我的PHP应用程序是否使用了太多内存?

时间:2010-03-16 17:03:47

标签: php apache optimization memory-management ram

我正在开发一个PHP Web应用程序,让用户可以相互联网,预订活动和互相发送消息。只有大约100个用户。

我使用Ubuntu 9.10,apache2,mysql 5和php 5在VPS上设置应用程序。我有360 Mb的RAM,但升级到720 MB。

最近,由于内存使用过多,我的Web应用程序一直在中断。从我在错误日志中可以看出,似乎服务器自动杀死占用过多内存的apache进程。因此,我将内存从360 MB升级到720 MB,作为一种权宜之计。

所以我的问题是,如何解决这些中断问题?我怎么知道我的网站是否需要更多的内存是由于代码不好或者它是否是网站自然增长的一部分?确定哪些PHP脚本占用最多内存的最有效方法是什么?

4 个答案:

答案 0 :(得分:4)

对此没有简单的答案,虽然我怀疑它可能是您代码中的问题。

php.ini文件中的memory_limit设置是什么?通常我建议至少4Mb,通常是16。你有多少并发命中?该网站是否进行了大量的统计数据报告?或者通过PHP渲染图像?你在任何地方使用file_get_contents()吗?

您确实需要设置一些自定义日志记录来报告每个URL,即退出时日志文件的大小。例如你可以自动添加:

<?php
register_shutdown_function('log_mem');

function log_mem()
{
   fputs(STDERR, '[' . date('c') . '] ' . memory_get_usage() . ' ' 
     . $_SERVER["REQUEST_URI"] . "\n");
}

(注意 - 没有结束标签) 这会将每个PHP页面使用的内存写出到error_log,这样您就可以更容易地隔离问题。

HTH

下进行。

答案 1 :(得分:3)

如果您的流程大小很小,您可以做的另一件事是将您的httpd设置调低为最小备用服务器为1,最大备用服务器为3.如果您只有100个用户,这应该没问题,因为您赢了只关心为少数用户启动流程的开销。

答案 2 :(得分:1)

这是一个支持PHP分析的工具:http://xdebug.org/docs/profiler

答案 3 :(得分:0)

取决于您的httpd&amp;的版本php,httpd可以保留它不需要的内存段,并且不必要地增加运行进程的大小。我有一个盒子可以做到这一点,我已经通过每晚进行一次httpd重启解决了这个问题:

30 00 * * *     /httpd/sbin/apachectl restart
31 00 * * *     /httpd/sbin/apachectl start
35 00 * * *     /httpd/sbin/apachectl start
40 00 * * *     /httpd/sbin/apachectl start

正如您所看到的,我会在3次追踪启动后跟进我的重启,以防万一重启后apache无法恢复生机。 3可能是矫枉过正,但另一方面,它不会伤害任何东西,所以为什么不呢。