PHP内存问题

时间:2011-07-06 11:02:17

标签: php apache

我设置memory_limit to -1。我仍然没有记忆问题。

我正在使用遗留系统,编码很差(:))。我运行apache基准来检查并发用户对系统的访问

ab -n2000 -c100 http://......com/

在日志文件中,我看到了很多与内存相关的问题。

在代码中,他们使用对象缓冲。这可能是个问题? object buffering是否与memory_limit相关?

2 个答案:

答案 0 :(得分:1)

更改PHP的内存限制会阻止它在超过某个值时被终止。但是,它不会为您的硬件提供更多内存(或交换)。最终,如果它需要你没有身体的记忆,那么事情就会破裂。

答案 1 :(得分:1)

PHP中的对象缓冲:我不知道这是什么意思,如果你的意思是使用ob_start和ob_stop输出缓冲它与对象缓冲无关并且对内存使用没有实际影响PHP。

PHP的内存使用取决于构建请求响应时创建的对象的大小。 如果你执行多次相同的请求,每个php执行的内存使用量应该是相同的

对内存使用情况进行“无限制”,您唯一要做的就是避免因内存使用过多而导致请求崩溃。这意味着如果您的问题是索引页面上的内存使用情况,您可以通过在此设置中设置一些值来轻松测试它,并减少直到它崩溃(64Mo,32Mo,16Mo,8Mo等)。你不需要ab。

现在,当您使用ab时,您可以让您的apache服务器响应多个并行请求。对于每个PHP请求,您都创建了一个新的apache进程。而这个新的apache进程将执行一个独立的PHP-thing,它将占用相同数量的内存,而其他进程执行相同的操作(因为您请求相同的页面,并且在不同的PHP执行和每个PHP之间没有任何共享)执行是在一个apache进程中完成的。)

我假设您正在使用apache与mpm_prefork和mod_php,而不是任何php-fpm或fastcgi php。

所以如果你在那种情况下遇到内存问题那可能是你允许过多的apache进程。默认情况下,它是150,如果每个进程占用30Mb的RAM(检查顶部),则它会生成30 * 150 = 4.3Go。看到问题了?

3个简单的解决方案

  • 减少apache进程数(MaxClients),并将MinSpareServer,MaxSpareServer和StartServer设置为相同的数量,不会浪费时间创建和销毁apache进程。
  • 限制PHP应用程序内存使用量,然后您将能够处理更多进程(好吧,不那么容易,可以长时间重写)
  • 使用 APC ,它会减少内存使用量(并加快执行速度)

之后其他解决方案更加复杂

  • worker 模式或nginx中使用apache,并使用 php-fpm
  • 从网络服务器中获取php
  • 使用像 varnish 这样的代理缓存来捕获可以缓存的请求(伪静态内容),并避免请求apache& PHP太多了。