增加PHP内存限制。什么时候会变得疯狂?

增加PHP内存限制。什么时候会变得疯狂?,php,memory,scalability,Php,Memory,Scalability,在我目前工作的一个系统中,有一个进程将大量数据加载到一个数组中,以进行排序/聚合/任何操作。我知道这个过程需要优化内存使用,但在短期内它只需要工作 给定加载到数组中的数据量,我们会不断达到内存限制。它已经增加了好几倍,我想知道是否有一个点,增加它通常成为一个坏主意?还是仅仅是机器有多少内存的问题 机器有2GB的RAM,内存限制当前设置为1.5GB。我们可以很容易地为机器添加更多的RAM(而且无论如何都会添加) 有没有其他人遇到过这样的问题?解决方案是什么?作为Apache模块到服务器网页运行的P

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

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

机器有2GB的RAM,内存限制当前设置为1.5GB。我们可以很容易地为机器添加更多的RAM(而且无论如何都会添加)


有没有其他人遇到过这样的问题?解决方案是什么?

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

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

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

当然,这也是一种“最坏情况”,即认为每个PHP页面都在使用尽可能多的内存


在你的情况下,如果你只需要一个作业就需要这么大的内存,我不会增加P的
内存限制ḦP作为Apache模块运行

相反,我将从命令行(或通过cron作业)启动该作业,并指定更高的
内存限制,具体来说,这是唯一的一种情况

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

$ php -d memory_limit=1GB temp.php
string(3) "1GB"
在本例中,考虑到temp.php仅包含:

var_dump(ini_get('memory_limit'));
在我看来,这比增加Apache PHP模块的内存限制要安全得多——当我有一个大数据集,或者一些非常沉重的东西无法优化或分页时,我通常会这样做


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

php -c /etc/phpcli.ini temp.php
这样,您就可以:

  • Apache的
    /etc/php.ini
    ,内存限制
    低,执行时间
    最长
  • 对于从命令行运行的批处理,
    /etc/phpcli.ini
    ,几乎没有限制
这确保了您的批处理能够运行,并且您的网站仍然具有安全性(
memory\u limit
max\u execution\u time
是安全措施)



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

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

如果从磁盘文件中获取数据,则可以使用该函数加载较小的数据块,或者在数据库中加载一些数据块


自从v3.0以后,我就没有检查过PHP,但您也可以使用云计算的一种形式。1GB数据集似乎足够大,可以在多台机器上处理

如果您知道脚本中存在需要修复的内存问题,并且您只是在寻找短期解决方案,那么我将不介绍解决内存问题的方法。听上去你会明白的

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

  • 系统上的总内存负载
  • 操作系统功能
PHP只是系统的一个小组件。如果允许它占用大量RAM,那么其他进程将受到影响,这反过来可能会影响脚本本身。值得注意的是,如果要从数据库中提取大量数据,那么DBMS可能需要大量内存才能为查询创建结果集。作为一个快速解决方案,您可能希望识别正在运行的任何查询并尽快释放结果,以便为长时间的作业运行提供更多内存

就操作系统功能而言,您应该记住,您可能正在运行的32位系统在没有特殊处理的情况下只能处理高达4GB的RAM。通常,根据其使用方式,限制可能会小得多。某些Windows芯片组和配置的可用系统容量实际上可能少于3GB,即使实际安装了4GB或更多。你应该检查一下你的系统能解决多少问题

你说你已经将内存限制提高了好几倍,所以很明显这项工作的范围越来越大。如果你的内存高达1.5Gb,那么即使再多安装2Gb的RAM,听起来也只是短暂的暂缓

有没有其他人遇到过这种情况 问题解决方案是什么


我想您可能已经知道,唯一真正的解决方案是崩溃并尽快花时间优化脚本,否则您将得到一个太大而无法运行的作业。

老实说,您不应该关心设置内存限制,而应该关心找出内存泄漏的位置并修复它。这不是仅仅增加内存限制的解决方案,而是避免代码中出现问题。查看您正在设置和取消设置哪些对象的值以清除泄漏。您能否具体说明数据量?你所说的大是什么意思?@Frederico:OP并不是在试图修复内存泄漏,他是在寻求一种解决方案来处理P中非常大的数据集