X字节的允许内存大小已耗尽。

42
致命错误:允许的内存大小为67108864字节(尝试分配13965430字节),已用尽
PHPInfo显示我的memory_limit为128M,因此我不明白为什么错误提示只有64M。phpinfo会报告错误吗?或者PHP使用了两个不同的php.ini文件?
错误是由我的一位同事在没有我的知情情况下添加到其中一个主要php文件中的ini_set调用引起的。

需要更多的上下文信息。你在哪里运行这个程序? - Pekka
这是我托管的一个网站上的脚本。它正在处理一堆位置数据并生成KML文件。但是,对于其中的一个特定数据集,它给了我这个错误。 - Nathan
你是否在共享服务器上?可能是所有者禁用了 memory_limit 更改。 - Marc B
我在一个共享服务器上,但是我已经与系统管理员交谈过了,他并没有提供太多帮助。他只告诉我在php.ini中增加memory_limit。我也尝试在脚本执行之前使用ini_set,但没有用。 - Nathan
4
可能是 php 中内存限制问题的重复提问 - Damjan Pavlica
让我印象深刻的是允许的字节数比分配的字节数要 - agoldev
8个回答

39

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

  1. 主系统的 php.ini 文件(通常位于 /etc 目录下)
  2. 在 Apache 配置中的某个位置中(httpd.conf 或某个站点的 .conf 文件,使用 php_value 进行设置)
  3. CLI 和 CGI 可以有不同的 php.ini 文件(使用命令 php -i | grep memory_limit 检查 CLI 的配置文件)
  4. 本地 .htaccess 文件(也可以使用 php_value 进行设置)
  5. 在脚本中(通过 ini_set() 进行设置)

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

还要注意的是,PHP 通常针对命令行和基于 Web 服务器的操作有不同的 .ini 文件。在命令行中运行 phpinfo() 将报告与在 Web 脚本中运行时不同的值。


嗯,我并不完全意识到这一点。然而,我刚刚在与另一个文件相同的目录中的一个PHP文件中检查了phpinfo(),而且本地和主值都是128M。:( - Nathan
更新:我刚刚更新了脚本,并在运行之前添加了ini_set以将内存增加到256,phpinfo报告本地已经增加,但脚本仍然失败并显示只有64M。 - Nathan
增加 memory_limit 可能会受到其他设置的限制,例如 suhosin-patch。也许 phpinfo() 无法确定这一点并返回错误的值。 - Dr.Molle
好的答案。所有可能的选项都已经提到了。 - Anand Solanki

27
ini_set('memory_limit', '128M'); 
或者
php.ini  =>  memory_limit = 128M
或者
php_value memory_limit 128M

请注意,问题是:“为什么错误显示我只有64M。phpinfo可能会报告不正确吗?或者PHP使用两个单独的php.inis?”我认为这并没有回答这些问题。 - qozle

19

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

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

注意:它会使服务器使用无限的内存。

更新:请小心使用,因为如果PHP脚本开始使用过多的内存,导致大量交换空间的使用,可能会减慢系统速度。如果您知道程序不会占用太多内存,或者您还不知道要设置多少内存,可以使用此选项。但是最终您将找到需要为该程序分配多少内存。

如@şarkı dinle所述,您应该始终将内存限制设置为某个值。

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

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


18
一切都很好,直到遭遇重击后,你的服务器就会内存不足。 - Wyatt Barnett
3
memory_limit 的存在是为了防止服务器因负载过重而崩溃或遭受物理损坏。将内存设置为无限制是不好的做法,相反,我们应该设定一个最大限制,然后优化代码或增加一些 RAM 来应对。请注意保持原文意思不变,并使翻译更加通俗易懂。 - Bikal Basnet
@WyattBarnett:感谢您指出。当时我是新手,没有认真对待这些事情。现在我明白了您的意思(刚刚错过了您的评论)。已更新答案。 - Somnath Muluk
@BikalBasnet:感谢您对旧答案的评论,该答案是误导性的。我已经根据您的评论更新了答案的一部分。 - Somnath Muluk

6

内存必须在多个位置进行配置。
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的问题。


1
这并不是完全必要的,这取决于设置和所需结果。对于这个问题,我只需要增加一个操作的大小,而不是整个应用程序的大小。 - Nathan

3

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


当我在 shell 中输入 phpinfo 时,它显示 memory_limit 是 128,但在页面上却是 64。我不确定发生了什么事情,这场流感让我的头都混乱了。 - Nathan
3
PHP也有不同的.ini文件,用于命令行操作和Web服务器操作。在其中一个文件中进行更改不会影响另一个文件,除非两个文件都使用相同的.ini文件。您需要在基于Web的脚本中运行phpinfo() - Marc B

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

1
如果通过增加内存限制你已经摆脱了错误并且代码现在可以运行,那么你需要采取措施来减少内存使用。以下是一些可行的方法:
如果你正在读取文件,请逐行读取而不是将整个文件读入内存。可以查看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


0
这个问题是由于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 这不好,并且大多数时候会减慢服务器速度。但是,如果您想要无限制,则此选项也适合您。 如果刷新页面后更改未反映出来,则必须重新启动本地服务器以进行更改。

祝你好运。希望它能帮助。 想要下载.htaccess文件,请单击此处。


这个回答没有提供任何新信息。事实上,我认为这个回答对Apache的强烈偏见使它不相关。并非每个人都使用Apache,而这个问题是关于PHP而不是Web服务器的。 - Nathan
我分享这个知识,只是因为有时在本地php.ini文件上进行更改很困难,当再次部署到服务器时需要重复相同的步骤。因此,我会分享这个。 - heySushil
但是您的回答并没有解决问题,而是解决了一个类似但不是此处所问的问题。 - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接