22

当我运行我的 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 运行本地服务器。我有 4GB RAM 的 64 位 Windows 7。我的脚本使用 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

4

10 回答 10

10

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

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

php_value memory_limit                  1024M
php_value max_execution_time            3000

这个问题不太频繁,但仍然发生(尤其是使用 Feature Recreate 时)

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

ThreadStackSize 16*1024*1024

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

于 2014-07-24T11:56:04.540 回答
9

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

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

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

据我所知,库使用情况不会显示在已提交的内存中,但仍计入 2GiB 限制(很像设备内存计入 32 位 Windows 上的 4GiB 限制。安装 2 GiB 显卡会给你带来什么低至 2GiB 的可用 RAM)。

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

于 2013-04-20T10:17:34.437 回答
1

您使用的是哪个 PHP 版本?

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

见:http ://bugs.php.net/bug.php?id=39132&edit=1

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

于 2010-12-09T14:17:39.673 回答
1

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

于 2013-04-20T10:28:02.383 回答
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
于 2013-01-29T00:54:42.053 回答
1

在 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
最后:systemctl restart apache2

于 2020-07-27T01:13:01.540 回答
0

我遇到了完全相同的问题,经过大量搜索后,我发现它与内存限制无关,但我的代码中有一个错误:我有一个使用数组的函数,位于外部文件中。在这个函数中,我将数组设置为“全局”,但错过了将文件包含在 tis 数组中......就像 spiderplant0 的错误一样,这给了我一个非常大的内存分配错误。因此,请检查您的代码并尝试查看哪个部分产生了此错误。

于 2022-01-25T18:11:25.703 回答
-1

尝试这个

set_time_limit(300);
ini_set('memory_limit', '20000M');
于 2010-12-09T14:17:45.103 回答
-2

尝试这个:

#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   
于 2010-12-09T14:21:44.793 回答
-5

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

于 2014-08-22T06:47:39.087 回答