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

在我目前正在使用的系统中,有一个将大量数据加载到数组中进行sorting/聚合/处理的过程。 我知道这个过程需要对内存使用进行优化,但在短期内只需要工作。

鉴于加载到数组中的数据量,我们保持达到内存限制。 它已经增加了好几次了,我想知道有没有增加它通常是一个坏主意的一个点? 还是仅仅是机器有多lessRAM?

机器有2GB的内存,memory_limit目前设置为1.5GB。 我们可以很容易地将更多的内存添加到机器上(无论如何)。

有没有人遇到过这种问题? 以及解决scheme是什么?

将PHP的memory_limitconfiguration作为Apache模块作为服务器网页运行时,必须考虑计算机上同时有多less个Apache进程 – 请参阅Apache的MaxClientsconfiguration选项。

如果MaxClients是100,而你有2000 MB或RAM,一个非常快速的计算将显示你不应该使用超过20 MB *(因为20 MB * 100客户端= 2 GB或RAM,即您的服务器的总内存量)*为memory_limit值。

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

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

在你的情况下,如果你只需要一个工作就需要如此大的内存空间,那么我不会增加P_P作为Apache模块运行的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执行定义多个值,则还可以使用-c选项告诉它使用另一个configuration文件,而不是缺省的php.ini:

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

这样,你有:

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

这可以确保您的批次能够运行 – 而且您的网站仍然具有安全性( memory_limitmax_execution_time是安全措施)

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

你是否尝试过把数据集分成更小的部分,并且只处理一部分?

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

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

鉴于您知道您的脚本存在内存问题,需要修复,而您只需要寻找短期解决scheme,那么我将不会讨论分析和解决内存问题的方法。 这听起来像你要去那个。

所以,我想说你必须记住的主要事情是:

  • 系统上的内存总负载
  • OSfunction

PHP只是系统的一个小部件。 如果你让它吃掉大量的RAM,那么其他的进程就会受到影响,进而影响到脚本本身。 值得注意的是,如果你从数据库中提取大量数据,那么你的DBMS可能需要大量的内存才能为你的查询创build结果集。 作为一个快速解决scheme,您可能需要确定正在运行的任何查询并尽快释放结果,以便为长时间运行提供更多内存。

在操作系统function方面,您应该记住,您可能正在运行的32位系统只能处理高达4GB的RAM,无需特殊处理。 取决于它的使用方式,限制通常要less得多。 一些Windows芯片组和configuration实际上可以有less于3GB的系统可用,即使是4GB或更多的物理安装。 你应该检查你的系统可以解决多less问题。

你说你多次增加了内存限制,显然这个工作的范围越来越大。 如果你达到1.5Gb,那么即使安装2Gb更多的内存听起来像是一个短暂的缓解。

有没有人遇到过这种问题? 以及解决scheme是什么?

我想你可能已经知道,唯一真正的解决办法是分解并花时间尽快优化脚本,否则最终会导致工作量太大而无法运行。