增加PHP的memory_limit。 它在什么时候变得疯狂?
在我目前正在使用的系统中,有一个将大量数据加载到数组中进行sorting/聚合/处理的过程。 我知道这个过程需要对内存使用进行优化,但在短期内只需要工作。
鉴于加载到数组中的数据量,我们保持达到内存限制。 它已经增加了好几次了,我想知道有没有增加它通常是一个坏主意的一个点? 还是仅仅是机器有多lessRAM?
机器有2GB的内存,memory_limit目前设置为1.5GB。 我们可以很容易地将更多的内存添加到机器上(无论如何)。
有没有人遇到过这种问题? 以及解决scheme是什么?
将PHP的memory_limit
configuration作为Apache模块作为服务器网页运行时,必须考虑计算机上同时有多less个Apache进程 – 请参阅Apache的MaxClients
configuration选项。
如果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_limit
和max_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是什么?
我想你可能已经知道,唯一真正的解决办法是分解并花时间尽快优化脚本,否则最终会导致工作量太大而无法运行。