PHP/Apache 的内存上限
Posted
技术标签:
【中文标题】PHP/Apache 的内存上限【英文标题】:Upper memory limit for PHP/Apache 【发布时间】:2011-05-22 21:33:32 【问题描述】:我在运行我的 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
【问题讨论】:
您确定同时需要如此大量的数据吗?您是从数千张其他图片中合成一张图片吗? 我同意难以捉摸。几乎可以肯定你做错了什么需要这么多内存。 我正在用许多小图像制作大图像。为此,我需要分配一个大的图像参考 - 这导致了问题。或者您是否建议有一种方法可以将许多图像组合在一起而不需要大量内存? @spiderplant0:AFAIK,GD 将其中一个小图像的内容复制到您的大图像上。复制后,您应该能够释放小图像的内存。您可以一次执行一个图像并减少同时使用的整体内存。大图像本身没有问题,因为它只有大约 88KB 的内存。问题是(显然)大量同时在内存中的小图像。 难以捉摸,我的代码结构是:(1)将所有小图像的文件名读入一个数组。 (2) 计算大图的大小并创建大图(imagecreatetruecolor)。 (3)依次打开每个小图,合并成大图(imagecopymerge)。第 1 步之后的内存使用量只有 1048576 字节。我在创建大图像期间出现内存错误 - 即在打开任何小图像之前 【参考方案1】:您使用的是哪个 PHP 版本?
memory_limit 变量是或曾经包含在一个 32 位整数中,因此不能超过 2GB。
见:http://bugs.php.net/bug.php?id=39132&edit=1
从该错误报告的底部评论中,它可能是将人类可读形式转换为数字的例程,尝试将其放入数字。
【讨论】:
我假设你有可用的内存?您是否尝试在 php.ini 中设置它? 是的,我在这两个地方都试过了。我有 4GB 物理内存。根据任务管理器的说法,在运行脚本之前有 44% 正在使用中(尽管对于 windows superfetch 来说很难说)。虽然我认为如果它用完了它只会使用页面文件缓存? 嗯,如果事实证明内存将成为问题。你想用图像做什么?该错误消息表明您已经在 PHP 中分配了大约 1.8GB 的 RAM。 在创建大图像之前只分配了 1048576 字节。请参阅上面对难以捉摸的回复。我用一组较小的图像尝试了脚本,效果很好。 @spiderplant0 你运行的是 64 位版本的 PHP 吗?【参考方案2】:试试这个
set_time_limit(300);
ini_set('memory_limit', '20000M');
【讨论】:
您是否注意到您要推荐 20 场演出?这应该如何工作? @jwueller 它应该像魅力一样工作?【参考方案3】:试试这个:
#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
【讨论】:
这些行应该放在哪里?互联网搜索表明其为 .htaccess?我的 xammp 文件夹中似乎没有这个文件? @Pradeep Singh:你为什么要输入#
?
我没有 .htaccess 文件我应该在哪里创建这个文件
然后在php.ini中添加upload_max_filesize=200M memory_limit=300M upload_max_filesize=200M post_max_size=200M max_execution_time=100000 max_input_time=100000
感谢 Pradeep Singh。但是为什么是300M等?你是说3000M吗?【参考方案4】:
检查您的 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
【讨论】:
【参考方案5】:您在 64 位操作系统上运行,但 Apache 和 PHP 可能仍然是 32 位。如果您使用的是 mod_php,那么 apache 将是这里的限制因素。
除非您使用 /3GB 开关并且软件知道 3GB 支持,否则 32 位进程的 RAM 限制约为 2GiB。
这仍然留下了大约 200 MiB 似乎未使用,但它足够小,可以被所有必须加载到内存中的各种库使用
据我所知,库使用情况不会显示在已提交的内存中,但仍会计入 2GiB 限制(很像设备内存计入 32 位 Windows 上的 4GiB 限制。安装 2GiB 图形的地方卡将您的可用 RAM 降至 2GiB 以下)。
最有可能的解决方案?安装一个 64 位 PHP,然后将其分派给它(可能使用 system() 调用)
【讨论】:
【参考方案6】:此问题可能是由运行 32 位 apache 和 php 引起的。尝试将这些升级到 64 位二进制文件,看看是否能解决问题。
【讨论】:
【参考方案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
它解决了内存崩溃问题。 希望对你有帮助
【讨论】:
似乎解决了我的问题(Win7、64bit、xampp)这个错误信息:VirtualAlloc() failed: [...] VirtualFree() failed: [...] [...] ] PHP 致命错误:[...] 中的内存不足(已分配 98566144)(试图分配 16384 字节)【参考方案8】:试试ini_set('memory_limit', '-1');
【讨论】:
【参考方案9】:在 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
【讨论】:
【参考方案10】:我遇到了完全相同的问题,经过大量搜索后,我发现它与内存限制无关,但我的代码中有一个错误:我有一个使用数组的函数,位于在外部文件中。在这个函数中,我将数组设置为“全局”,但错过了将文件包含在 tis 数组中...... 就像 spiderplant0 的错误一样,这给了我一个内存分配非常大的错误。 因此,请检查您的代码并尝试查看是哪个部分产生了此错误。
【讨论】:
以上是关于PHP/Apache 的内存上限的主要内容,如果未能解决你的问题,请参考以下文章