提高 PHP memory_limit。什么时候会变得疯狂?

2022-08-30 12:06:03

在我目前正在使用的系统中,有一个过程将大量数据加载到数组中以进行排序/聚合/其他任何操作。我知道这个过程需要优化内存使用,但在短期内它只需要工作。

给定加载到数组中的数据量,我们不断达到内存限制。它已经增加了好几次,我想知道增加它通常成为一个坏主意吗?还是只是机器有多少RAM的问题?

计算机具有 2GB 的 RAM,memory_limit当前设置为 1.5GB。我们可以轻松地向计算机添加更多RAM(无论如何都会)。

其他人是否遇到过此类问题?解决方案是什么?


答案 1

作为Apache模块到服务器网页运行的PHP的配置必须考虑您可以在机器上同时拥有多少个Apache进程 - 请参阅Apache的配置选项。memory_limitMaxClients

如果 为 100 并且您有 2,000 MB 的 RAM,则非常快速的计算将显示您不应使用超过 20 MB *(因为 20 MB * 100 客户端 = 2 GB 或 RAM,即服务器具有的内存总量)* 作为memory_limit值。MaxClients

这没有考虑到可能在同一台服务器上运行其他东西,例如MySQL,系统本身,...Apache可能已经为自己使用了一些内存。

或者当然,这也是一个“最坏的情况”,它认为每个PHP页面都在使用它所能使用的最大内存量。


在你的情况下,如果你只需要一个作业的内存量,我不会增加作为Apache模块运行的PḦP。memory_limit

相反,我会从命令行(或通过cron作业)启动该作业,并在这一和唯一的情况下指定一个更高的作业。memory_limit

这可以通过php的选项来完成,例如:-d

$ php -d memory_limit=1GB temp.php
string(3) "1GB"

考虑到在这种情况下,temp.php仅包含:

var_dump(ini_get('memory_limit'));

在我看来,这比增加Apache PHP模块memory_limit更安全 - 这是我通常做的,当我有一个大型数据集,或者一些无法优化或分页的非常重的东西时。


如果需要为 PHP CLI 执行定义多个值,还可以告诉它使用另一个配置文件,而不是默认的 php.ini,并带有以下选项:-c

php -c /etc/phpcli.ini temp.php

这样,您就有:

  • /etc/php.ini对于 Apache,具有低 , 低 , ...memory_limitmax_execution_time
  • 对于从命令行运行的批处理,几乎没有限制/etc/phpcli.ini

这可以确保您的批处理能够运行 - 并且您仍然可以为您的网站提供安全性(并且是安全措施)memory_limitmax_execution_time


不过,如果你有时间优化你的脚本,你应该;例如,在那种必须处理大量数据的情况下,分页是必须的;-)


答案 2

您是否尝试过将数据集拆分为更小的部分,并且当时只处理一个部分?

如果从磁盘文件获取数据,则可以使用 fread() 函数加载较小的块,或者在数据库的情况下加载某种无缓冲的 db 查询

自从v3.something以来,我还没有检查过PHP,但你也可以使用一种云计算形式。1GB数据集似乎足够大,可以在多台计算机上进行处理。


推荐