如何知道我的PHP应用程序是否占用了太多内存?

如何知道我的PHP应用程序是否占用了太多内存?,php,apache,optimization,memory-management,ram,Php,Apache,Optimization,Memory Management,Ram,我正在开发一个PHPWeb应用程序,它可以让用户彼此联网、预订活动和相互发送消息。只有大约100个用户 我使用Ubuntu 9.10、apache2、mysql 5和php 5在VPS上设置了该应用程序。我有360MB的RAM,但升级到720MB 最近,我的web应用程序由于内存使用过多而中断。从错误日志中可以看出,服务器似乎会自动杀死消耗过多内存的apache进程。因此,作为权宜之计,我将内存从360MB升级到720MB 所以我的问题是,我如何着手解决这些停机问题?我如何知道我的网站需要更多的

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

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

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


所以我的问题是,我如何着手解决这些停机问题?我如何知道我的网站需要更多的内存是由于糟糕的代码还是网站自然增长的一部分?确定哪些PHP脚本占用最多内存的最有效方法是什么?

这里有一个支持评测PHP的工具:

根据您的httpd&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可能有点过头了,但另一方面,它不会伤害任何东西,所以为什么不呢。

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

对此没有简单的答案,尽管我怀疑这可能是您的代码中的一个问题

php.ini文件中的内存限制设置是什么?通常我建议至少4Mb,通常是16。你同时命中了多少次?该网站是否有大量的统计数据报告?还是通过PHP渲染图像?您是否在任何地方使用file\u get\u contents()

您确实需要设置一些自定义日志来报告每个URL,以及退出时日志文件的大小。e、 g.您可以自动预编:

<?php
register_shutdown_function('log_mem');

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

您只有720MB内存?你应该考虑得到更多的RAM。你使用的不是10年前的软件。我至少应该有多少内存?@ghostdog74:他使用的是VPS,这是一个虚拟服务器,您通常按月支付磁盘和内存资源的费用。您应该拥有的内存量IMHO是apache进程大小*并发进程数+10%+基线内存使用率。不知道为什么会被否决,很多人都报告过使用lamp堆栈时内存泄漏:这并不意味着它是httpd泄漏内存,它也可以很容易地成为php内部调用的库。这并不能否认内存将归属于httpd进程这一事实……而且,我可能得到一个进程,该进程在重启尝试使apache恢复的时间段内不会死亡。更具体地说,我让apache在午夜优雅地死去,这是因为死亡的过程花费了太多的时间。再说一次,如果你要投反对票,我希望你能给我一个理由,或者至少是一个更好的做事方式……因为这不是一个解决方案,而是一个变通办法。有很多地方可以找到这样的泄漏——这与zvar堆被填满的报告问题不太可能有任何关系。问题是:“我如何着手解决这些停机问题?”这可能不是最好的方法,但这是一种回收泄漏内存的方法。这就像说散热器软管上的管道胶带不是维修,而是一种解决方法。继续干吧,在沙漠中汗流浃背,然后拒绝使用管道胶带。得到以下信息:“警告:fputs()期望参数1是资源,字符串给定…”