增加PHP memory_limit.它变得疯狂到什么程度?

Bre*_*ker 38 php memory scalability

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

鉴于加载到数组中的数据量,我们不断达到内存限制.它已经增加了好几次,我想知道增加它通常是一个坏主意吗?或者只是机器有多少RAM?

该机器有2GB的RAM,memory_limit目前设置为1.5GB.我们可以轻松地为机器添加更多RAM(无论如何都会).

有其他人遇到过这种问题吗?什么是解决方案?

Pas*_*TIN 56

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

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

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

当然,这也是一个"最糟糕的情况",它认为每个PHP页面都使用了最大的内存量.


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

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

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

$ php -d memory_limit=1GB temp.php
string(3) "1GB"
Run Code Online (Sandbox Code Playgroud)

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

var_dump(ini_get('memory_limit'));
Run Code Online (Sandbox Code Playgroud)

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


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

php -c /etc/phpcli.ini temp.php
Run Code Online (Sandbox Code Playgroud)

那样,你有:

  • /etc/php.ini对于Apache,低memory_limit,低max_execution_time,......
  • /etc/phpcli.ini用于批量从命令行运行,几乎没有限制

这可以确保您的批次能够运行 - 并且您仍然可以为您的网站提供安全保障(memory_limit并且max_execution_time是安全措施)


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

  • 在某些PHP版本中(例如带有Suhosin-Patch的PHP 5.3.15),设置为1G,而不是1GB.测试它或PHP将限制设置为最低值并且您的脚本将无法执行,例如使用`php -d memory_limit = 1G -r"echo ini_get('memory_limit');"` (4认同)