10

我正在开发一个 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

4 回答 4

5

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

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 中,这样您就可以更轻松地隔离问题。

高温高压

C。

于 2010-03-16T23:37:11.990 回答
3

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

于 2010-03-16T17:13:04.123 回答
2

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

于 2010-03-16T17:09:07.613 回答
0

根据您的 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 可能是矫枉过正,但另一方面,它不会伤害任何东西,所以为什么不呢。

于 2010-03-16T17:10:50.120 回答