增加PHP memory_limit。在什么时候变得疯狂?

2020/12/31 07:41 · php ·  · 0评论

在我目前正在研究的系统中,有一个过程将大量数据加载到数组中以进行排序/聚合/处理。我知道此过程需要针对内存使用情况进行优化,但是从短期来看,它只是需要工作。

给定加载到数组中的数据量,我们不断达到内存限制。它已经增加了好几次,我想知道在某种程度上增加它通常是个坏主意吗?还是取决于计算机具有多少RAM?

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

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

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

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

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

Or course, this is also a "worst case scenario", that considers that each PHP page is using the maximum amount of memory it can.

In your case, if you need such a big amount of memory for only one job, I would not increase the memory_limit for PḦP running as an Apache module.

Instead, I would launch that job from command-line (or via a cron job), and specify a higher memory_limit specificaly in this one and only case.

This can be done with the -d option of php, like :

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

Considering, in this case, that temp.php only contains :

var_dump(ini_get('memory_limit'));

In my opinion, this is way safer than increasing the memory_limit for the PHP module for Apache -- and it's what I usually do when I have a large dataset, or some really heavy stuff I cannot optimize or paginate.


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

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

这样,您就可以:

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

这样可以确保您的批次能够运行-并且您仍将拥有网站的安全性memory_limitmax_execution_time作为安全措施)


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

您是否尝试过将数据集拆分为较小的部分,并且一次只能处理一部分?

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

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

既然你知道有内存问题与你的脚本,需要修复,你只是在寻找短期解决方案,那么我不会解决的方式去剖析和解决您的内存问题。听起来您将要做到这一点。

因此,我要说的是,您需要牢记的主要内容是:

  • 系统上的总内存负载
  • 操作系统功能

PHP只是系统的一小部分。如果您让它吞噬了大量的RAM,则其他进程将受到影响,进而可能影响脚本本身。值得注意的是,如果要从数据库中提取大量数据,则DBMS可能需要大量内存才能为查询创建结果集。作为快速解决方案,您可能希望识别正在运行的任何查询,并尽快释放结果,以便为更长的工作时间分配更多的内存。

在操作系统功能方面,您应该记住,您可能正在运行的32位系统只能寻址多达4GB的RAM,而无需进行特殊处理。通常,该限制可能会少得多,具体取决于使用方式。某些Windows芯片组和配置实际上可以为系统提供少于3GB的可用空间,即使实际安装了4GB或更多的空间。您应该检查一下系统可以处理多少。

您说您已经多次增加了内存限制,所以很显然,这项工作的范围越来越大。如果您的内存最大为1.5Gb,那么即使再安装2Gb RAM听起来也只是短暂的等待。

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

我想您可能已经知道,唯一真正的解决方案是分解并花费时间来尽快优化脚本,否则最终您将面临无法执行的工作。

本文地址:http://php.askforanswer.com/zengjiaphp-memory_limitzaishenmeshihoubiandefengkuang.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!