我设置memory_limit to -1
。我仍然没有记忆问题。
我正在使用遗留系统,编码很差(:))。我运行apache基准来检查并发用户对系统的访问
ab -n2000 -c100 http://......com/
在日志文件中,我看到了很多与内存相关的问题。
在代码中,他们使用对象缓冲。这可能是个问题? object buffering
是否与memory_limit
相关?
答案 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个简单的解决方案
之后其他解决方案更加复杂