已用完 X 字节的允许内存大小

Posted

技术标签:

【中文标题】已用完 X 字节的允许内存大小【英文标题】:Allowed memory size of X bytes exhausted 【发布时间】:2011-05-05 00:56:16 【问题描述】:

致命错误:允许的内存大小为 67108864 字节已用尽(尝试分配 13965430 字节)

phpInfo 显示我的 memory_limit 为 128M,所以我很困惑为什么错误说我只有 64M。 phpinfo有可能报错吗?还是让 PHP 使用两个单独的 php.inis?

错误是由我的同事在我不知情的情况下添加的主要 php 文件之一中的 ini_set 调用引起的。

【问题讨论】:

需要更多上下文。你在哪里运行这个? 这是我托管的网站上的脚本。它正在处理一堆位置数据并生成 KML。但是,对于一组特定的数据,它给了我这个错误。 您在共享服务器上吗?可能是所有者禁用了 memory_limit 更改。 我在共享服务器上,但我已与系统管理员交谈过,他并没有提供多大帮助。他只告诉我增加 php.ini 中的 memory_limit。在脚本执行之前我也尝试过 ini_set,但无济于事。 Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php的可能重复 【参考方案1】:

这个问题是因为 php.ini 定义的限制被排除了,但有很多解决方案,但简单的一个是找到你的本地服务器文件夹,然后找到 php 文件夹,在那个文件夹中有 php.ini 文件具有这些类型设置的所有声明。您只需要找到一个并更改该值。但是在这种情况下,一旦您更改了本地主机文件,就会出现一个大问题,但是当您想将站点放在服务器上时,服务器又会产生同样的问题,并且您再次对服务器遵循相同的问题。 但是您也知道 .htaccess 文件,这是在不更改核心文件的情况下做很多事情的最佳且单一的地方之一。 就像您更改 www 路由,从 url 中删除 .php 或其他扩展名或添加一个。 同样,您也可以像这样在这里定义 php.ini 的默认值 - 首先,您需要从根目录打开 .htaccess 文件,或者如果您没有此文件,请在站点的根目录中创建一个并将此代码粘贴到上面 -

php_value upload_max_filesize 1000M
php_value post_max_size 99500M
php_value memory_limit 500M
php_value max_execution_time 300

更改后如果您想检查更改,只需运行 php 代码

<?php phpinfo(); ?> 

它将向您显示 php 配置的所有详细信息。所以你会发现你的变化。

注意:要定义无限制,只需添加 -1 即可 php_value memory_limit -1 这不好,而且大多数时候会减慢您的服务器。但是,如果您想减少限制,那么这个选项也适合您。 如果刷新后您的页面更改未反映您必须重新启动本地服务器一次以进行更改。

祝你好运。希望它会有所帮助。 Want to download the .htaccess file click this.

【讨论】:

这个答案没有提供新信息。事实上,我认为这个答案对 Apache 的强烈偏见使其无关紧要。不是每个人都使用 Apache,这个问题是关于 PHP,而不是网络服务器。 我分享这些知识只是因为有时很难在本地 php.ini 文件上进行更改,而当再次部署到服务器上时也会这样做。为此,我会分享这个。 但是您的回答并没有解决问题,它解决了此处未提出的类似问题。【参考方案2】:
1 check current limit:
(in my os)php -i | grep limit  => memory_limit => 256M => 256M

2  locate php.ini 
php --ini =>   
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/curl.ini 
...

3 change memory_limit in php.ini
vi /etc/php.ini
memory_limit = 512M

4 restart nginx and (php-fpm if being used)
service php-fpm restart
service nginx restart

【讨论】:

【参考方案3】:

我有同样的问题。我找到了答案:

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

注意:这将占用服务器无限的内存。

更新: 请谨慎使用,因为如果 PHP 脚本开始使用过多的内存,这可能会降低您的系统速度,从而导致大量交换空间使用。如果您知道程序不会占用太多内存并且您现在不知道要设置多少内存,则可以使用它。但是您最终会发现该程序需要多少内存。

您应该始终将内存限制为@şarkı dinle 回答的某个值。

ini_set('memory_limit', '512M');

提供无限内存是不好的做法,我们应该给出一些我们可以承受的最大限制,然后优化我们的代码或添加一些 RAM。

【讨论】:

工作正常,直到您遇到严重问题并且您的服务器内存不足。 memory_limit 的存在是有原因的,这样您的服务器就不会因过载而崩溃或承受任何物理损坏。给它无限的内存是不好的做法,我们应该给出一些我们可以承受的最大限制,然后优化我们的代码或添加一些 RAM。 @WyattBarnett:感谢您的指出。那时我比较新鲜,没有认真对待事情。现在我明白你的意思了。 (只是错过了你的评论)。更新了答案。 @BikalBasnet:感谢您对具有误导性的旧答案的评论。我已经用你的部分评论更新了答案。【参考方案4】:

如果通过增加内存限制您已经摆脱了错误并且您的代码现在可以工作,那么您需要采取措施来减少内存使用量。以下是您可以采取的一些措施来减少它:

如果您正在读取文件,请逐行读取它们,而不是将整个文件读入内存。查看 fgets 和 SplFileObject::fgets。 如果您使用的是 PHP 5.3,请升级到新版本的 PHP。 PHP 5.4 和 5.5 使用的内存要少得多。

避免将大型数据集加载到数组中。相反,请处理较大数据集的较小子集,并在必要时将数据保存到数据库中以减少内存使用。

尝试第三方库的最新版本或次要版本(例如,1.9.3 与您的 1.8.2)并使用更稳定的版本。有时,较新版本的库的编写效率更高。

如果您有一个不常见或不稳定的 PHP 扩展,请尝试升级它。它可能有内存泄漏。

如果您正在处理大文件并且您根本无法逐行读取,请尝试将文件分成许多较小的文件并单独处理这些文件。 禁用不需要的 PHP 扩展。

在问题区域中,取消设置包含大量数据且代码后面不需要的变量。

发件人:https://www.airpair.com/php/fatal-error-allowed-memory-size

【讨论】:

【参考方案5】:

内存必须在多个位置进行配置。 将memory_limit设置为512M:

sudo vi /etc/php5/cgi/php.ini
sudo vi /etc/php5/cli/php.ini
sudo vi /etc/php5/apache2/php.ini Or /etc/php5/fpm/php.ini

重启服务:

sudo service service php5-fpm restart
sudo service service nginx restart

sudo service apache2 restart

终于解决了memory_limit的问题

【讨论】:

这不是完全必要的,具体取决于设置和所需的结果。特别是对于这个问题,我只需要为一个操作而不是整个应用程序增加它。【参考方案6】:

PHP的配置可以在多个地方设置:

    主系统php.ini(通常在 /etc 某处) Apache 配置中的某个位置(httpd.conf 或每个站点的 .conf 文件,通过 php_value) CLI 和 CGI​​ 可以有不同的 php.ini(使用命令 php -i | grep memory_limit 检查 CLI 配置) 本地 .htaccess 文件(也称为 php_value) 在脚本中(通过ini_set()

在 PHPinfo 的输出中,“Master”值是编译后的默认值,“Local”值是实际生效的值。它可以与默认值保持一致,也可以在上述任何位置被覆盖。

另请注意,PHP 通常具有不同的 .ini 文件,用于命令行和基于 Web 服务器的操作。从命令行检查 phpinfo() 将报告与在基于 Web 的脚本中运行它时不同的值。

【讨论】:

嗯,我并没有完全意识到这一点。但是,我刚刚检查了与另一个文件位于同一目录的 PHP 文件中的 phpinfo(),Local 和 Master 的值都是 128M。 :( 更新:我刚刚更新了脚本,在运行前添加了ini_set 将内存增加到256,phpinfo报告本地增加了,但是脚本仍然失败并说只有64M。 增加 memory_limit 可能会受到其他设置的限制,例如 suhosin-patch。也许 phpinfo() 无法确定这一点并返回不正确的值。 好答案。提到了所有可能的选项。【参考方案7】:
ini_set('memory_limit', '128M'); 

php.ini  =>  memory_limit = 128M

php_value memory_limit 128M

【讨论】:

【参考方案8】:

如果您确定在配置 php.ini 后重新启动了 Apache,那么您可能正在查看错误的 php.ini 文件

【讨论】:

好吧,当我在 shell 中输入 phpinfo 时,它说 memory_limit 是 128,但在页面上却显示为 64。我不知道发生了什么事,这流感让我头晕目眩起来。 PHP 也有不同的 .ini 文件用于命令行操作和网络服务器操作。更改其中一个不会影响另一个,除非两者都使用相同的 .ini 文件。您需要在基于 Web 的脚本中运行 phpinfo()

以上是关于已用完 X 字节的允许内存大小的主要内容,如果未能解决你的问题,请参考以下文章

查看代码以防止允许的内存限制问题

超大表导致允许的内存大小为 x 字节耗尽错误

修正“严重错误:允许使用X字节的内存大小用尽(尝试分配X字节)”,并且使用作曲家安装

诊断内存泄漏 - # 字节的允许内存大小已用尽

致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 71 字节)

允许的内存大小 134217728 字节用尽(尝试分配 4294967296 字节)