PHP内存问题

PHP内存问题,php,apache,Php,Apache,我将内存\u限制设置为-1。但我仍然有内存不足的问题 我使用的是一个遗留系统,它的编码很差(:)。我运行apachebenchmark来检查并发用户对系统的访问 ab-n2000-c100 在日志文件中,我看到了很多与内存相关的问题 在代码中,它们使用对象缓冲。这可能就是问题所在?。对象缓冲是否与内存限制相关?更改PHP上的内存限制会在超过某个值时停止它被杀死。但是,它在物理上并没有为硬件提供更多内存(或交换)。最终,如果它需要你没有的内存,那么它就会崩溃。PHP中的对象缓冲:我不知道它是什么意

我将
内存\u限制设置为-1
。但我仍然有内存不足的问题

我使用的是一个遗留系统,它的编码很差(:)。我运行apachebenchmark来检查并发用户对系统的访问

ab-n2000-c100

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


在代码中,它们使用对象缓冲。这可能就是问题所在?。
对象缓冲是否与
内存限制相关?

更改PHP上的内存限制会在超过某个值时停止它被杀死。但是,它在物理上并没有为硬件提供更多内存(或交换)。最终,如果它需要你没有的内存,那么它就会崩溃。

PHP中的对象缓冲:我不知道它是什么意思,如果你指的是带有ob\u start和ob\u stop的输出缓冲,那么它与对象缓冲无关,也不会对PHP的内存使用产生影响

PHP的内存使用情况取决于生成请求响应时所创建对象的大小。如果您多次执行同一请求,那么每次php执行的内存使用量应该是相同的

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

现在,当您使用ab时,您可以让apache服务器响应多个并行请求。对于每个PHP请求,都会创建一个新的apache进程。这个新的apache进程将执行一个独立的PHP进程,它将占用与其他进程相同的内存量(当您请求相同的页面时,不同的PHP执行之间不会共享任何内容,每个PHP执行都在一个apache进程中完成)

我假设您使用的是带有mpm_prefork和mod_php的apache,而不是任何php fpm或fastcgi php

因此,如果您在这种情况下出现内存问题,可能是因为您允许apache有太多的进程。默认情况下,它是150,如果每个进程占用30Mb的RAM(用top检查),那么它将使30*150=4.3Go。看到问题了吗

3个简单的解决方案

  • 减少apache进程的数量(MaxClient),并将MinSpareServer、MaxSpareServer和StartServer设置为相同的数量,这样就不会浪费创建和销毁apache进程的时间
  • 限制PHP应用程序内存的使用,这样您就可以处理更多的进程(嗯,不是那么容易,可能需要很长时间的重写)
  • 使用APC,它可以减少内存使用(并加快执行)
在那之后,其他的解决方案就更复杂了

  • worker模式或nginx中使用apache,并使用php-fpm从web服务器中获取php
  • 使用代理缓存,如varnish捕获可以缓存的请求(伪静态内容),并避免对apache和PHP请求过多

因此,如果我使用4GB ram,而对于1000个用户,它只使用2Gb ram。将内存限制设置为-1是否值得?取决于您的操作系统、配置等。其他应用程序/守护进程也需要内存;)