PHP / Apache的内存上限

时间:2010-12-09 14:14:03

标签: php apache memory-limit

运行PHP脚本时出现错误....

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes)

我已将此行添加到我的PHP脚本中..

ini_set("memory_limit","3000M");

这句话似乎确实正确地控制了内存使用量,但我似乎无法将其高于1.8GB。 好像上限内存被限制在其他地方。 我也加入了php.ini ......

memory_limit = 3000M

有人知道内存是否在其他地方受到限制?

我正在使用Xampp运行本地服务器。 我有Windows 7,64位,4GB内存。 我的脚本使用PHP的GD图像库,在尝试使用ImageCreateTrueColor()分配图像引用时出现错误。

(我知道这是一个巨大的内存 - 但这只是一个脚本,这样做更容易。)

感谢。

...更新

@elusive @Orbling 我希望每个人都对这个问题感到厌倦,但这里有简化的代码来说明这个问题。

<?php
    ini_set("memory_limit","4000000000");
    echo "ini_get = " . ini_get('memory_limit') . "<br>\n";
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>\n";
    $bigImageHandle = imagecreatetruecolor(22200, 24800);  //this is line 5
?>

浏览器输出...

ini_get = 4000000000
memory_get_usage = 524288

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in
E:\User\My_Webs\experiments\houseshunting\temp\osMaps\t1.php on line 5

我用一小块瓷砖和imagecreatetruecolor()使用的内存测试了这个,我估计我需要2.7GB

9 个答案:

答案 0 :(得分:9)

您运行的是64位操作系统,但Apache和PHP可能仍然是32位。如果你正在使用mod_php,那么apache将是限制因素。

32位进程受限于大约2GiB的RAM,除非您使用/ 3GB开关并且软件知道3GB支持。

这仍然留下大约200 MiB似乎未使用,但它足够小,它可以被各种库使用,所有库都必须加载到内存

据我所知,库使用量不会显示在已提交的内存中,但仍会计入2GiB限制(很像设备内存计入32位窗口的4GiB限制。在哪里安装2 GiB图形卡将您带到2GiB以下的可用RAM。

最有可能解决方案?安装64位PHP,然后将其分发给它(可能使用system()调用)

答案 1 :(得分:7)

使用Acquia Dev Desktop,我遇到了很多内存限制崩溃。

将内存限制增加到PHP.ini。

php_value memory_limit                  1024M
php_value max_execution_time            3000

此问题较少发生但仍然存在(特别是使用功能重新创建)

在我的httpd.conf中,我将StackThread增加到16M

ThreadStackSize 16*1024*1024

它解决了内存崩溃问题。 希望它可以提供帮助

答案 2 :(得分:1)

您使用的是哪个PHP版本?

memory_limit变量是或者包含在32位整数中,因此不能超过2GB。

请参阅:http://bugs.php.net/bug.php?id=39132&edit=1

从底部对该错误报告的评论中,可能是将人类可读形式翻译成数字的例程,尝试将其放入数字中。

答案 3 :(得分:1)

检查您的Apache配置(例如,httpd.conf)。可能有RLimitMEM指令限制子进程处理请求的内存允许。

因此,您可以设置所需的PHP限制,如果Apache使用内存限制生成进程,则不能超过该限制。

如果您使用托管服务并拥有共享服务器,则可能无法访问此配置并需要与您的提供商合作。正如您所看到的,它的配置适用于整个服务器范围......您不太可能让他们改变这一点。再说一次,如果你想要产生比1.5Gig更大的进程,那么你应该以不同的方式解决问题(其他人提出这个问题)或获得某种专用服务器(例如EC2)。

例如:

/usr/local/apache/conf
#RLimitMEM 85643200 104857600   # Limit to: 80Mb / process, 100Mb total
RLimitMEM 134217728 537395200   # Limit to: 128Mb / Process, 512Mb total

答案 4 :(得分:1)

问题可能是由运行32位apache和php引起的。尝试将这些升级到64位二进制文​​件,看看是否能解决问题。

答案 5 :(得分:0)

试试这个

set_time_limit(300);
ini_set('memory_limit', '20000M');

答案 6 :(得分:0)

在Ubuntu 18.04中
检查PHP版本: php -v
就我而言,我有PHP 7.4
编辑文件: nano /etc/php/7.4/apache2/php.ini
搜索并更改 memory_limit = 2048M
编辑文件: nano /etc/php/7.4/cli/php.ini
搜索并更改 memory_limit = 2048M
最后:服务apache2重新启动

答案 7 :(得分:-1)

试试这个:

#php_value memory_limit 300M 
#php_value upload_max_filesize 200M 
#php_value post_max_size 200M 
#php_value max_execution_time 80000 
#php_value max_input_time 80000   

答案 8 :(得分:-3)

尝试ini_set('memory_limit', '-1');