允许的内存大小为33554432字节,已在php中耗尽(尝试分配43148176字节)


279

正在显示此错误消息,有什么建议吗?

允许的内存大小为33554432字节,已在php中耗尽(尝试分配43148176字节)


5
在php.ini文件中将最大内存限制增加到64MB。Google搜索但是我能问您为什么要分配这么多内存吗?它在哪行代码失败?

1
脚本失败时会做什么?你可以发布代码吗?
尼尔·艾特肯

3
看起来像一个非常大的txt文件。
macbirdie

10
按照惯例,您一次读取的文件可能具有较大的大小或任意大小,每次读取的行都会覆盖前一个行的存储器。或者,您可能只想拖尾文件或获取文件以获取最新条目。不能随着文件的增长而增加内存分配。
ekerner

Answers:


318

最后我找到了答案:

只需将以下行添加到文件中出现错误的行之前

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

它将无限使用服务器的内存,工作正常。

感谢您提出建议的朋友。


125
你还应该检查为什么内存被耗尽。也许您不需要读取整个文件,也可以顺序读取。
macbirdie

8
- @panidarapu和@Don琼斯:根据内存量,以及如何使用这些脚本,它可能是危险的,让这样的内存使用量的变化。在您的情况下,唐,您可以将提要分解成较小的块,然后解析所需的内容。很高兴它有效,但要小心。
匿名

5
这个建议对我有用。通过函数ini_set()动态增加脚本中的内存限制:ini_set('memory_limit','128M');
mente

37
伙计们,请不要寻求此快速修复。从长远来看,它可能会伤害您。作为一名优秀的程序员,您应该弄清楚内存消耗背后的原因并根据需要增加内存,而不要保留它UNLIMITED
Sumoanand

113
哇,对我来说,这个被大刀阔斧的答案似乎是一种非常糟糕的做法。-1!
Ambidex

59

以下是两种增加共享主机限制的简单方法:

  1. 如果您有权访问PHP.ini文件,请更改PHP.ini中的行。如果您的行显示32M,请尝试64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. 如果您无权访问PHP.ini,请尝试将其添加到.htaccess文件中: php_value memory_limit 64M


47

您的脚本占用了太多内存。如果您的循环失控,并且每次循环创建对象或将其添加到数组中,通常会在PHP中发生这种情况。

检查无限循环。

如果这不是问题,请通过将设置为null的对象销毁完成的对象,以尝试提供帮助。例如。$OldVar = null;

检查错误实际上也发生的代码。您是否希望该行分配大量内存?如果没有,请尝试找出问题所在...


3
我遇到了这个确切的问题-原来我无意间创建了一个递归函数-因此在代码执行过程中,它在任何随机时间都耗尽了内存。现在,我拥有世界上最高效的内存效率代码,这是我在寻找内存泄漏时所具有的优势。
克里斯·塞尔贝克

1
为了其他人的缘故,他们会追赶兔子。我认为Symfony中的主义存在独白问题,当存在PDO异常时,它将创建一个无限循环的异常,因为它将尝试该异常的异常,从而隐藏了真正的问题(在我的情况下,损坏的db文件)。
Desislav Kamenov

39

正在做:

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

永远都不好。如果要读取很大的文件,最好的做法是一点一点地复制它。尝试以下代码以获得最佳实践。

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
不敢相信所有这些建议将memory_limit设置为-1的人。在生产服务器上要做的疯狂的事情。感谢您提供更清洁的解决方案。
JohnWolf

2
在“最佳实践”中,最好在while循环后关闭文件处理程序:fclose($file)
kodeart 2015年

2
@assetCorp如果文件具有例如100MiB并且PHP内存限制仍设置为32 MiB,则如何提供帮助。您可以通过1MiB的安全块读取它,然后将其附加到一个变量中,该变量将在循环达到31.迭代时使用所有可用内存。有什么更好的办法吗?仅输出类似的块而不需要将它们全部存储在一个变量中将有助于解决该问题。
helvete

17

不幸的是,用PHP进行编程很容易,因为它消耗内存的速度比您想象的要快。复制字符串,数组和对象而不使用引用可以做到这一点,尽管PHP 5应该比PHP 4更自动地做到这一点。但是与处理最小的逻辑单元相比,在多个步骤上完整地处理数据集也很浪费。一次。经典示例是使用数据库中的大型结果集:大多数程序员将整个结果集提取到一个数组中,然后使用进行一次或多次遍历foreach()。使用while()循环来一次获取和处理一行的内存效率更高。这同样适用于处理文件。


看起来很可能就是这样做的。
喀恰

13

如果要读取大文件,则应一点一点地读取它们,而不是一次读取它们。
这很简单:如果一次读取一个1 MB的大文件,那么一次至少需要1 MB的内存来保存数据。

因此,您应该使用fopen&一点一点地阅读它们fread


1
使用以下方法解决了此问题:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack

12

我在Laravel 5.6的php7.2中遇到了同样的问题。我只是memory_limit = 128M根据应用程序的需求增加了php.ini中的变量数量。可能是256M / 512M / 1048M .....现在工作正常。


6

我也遇到了同样的问题,寻找phpinfo.ini,php.ini或.htaccess文件无济于事。最后,我查看了一些php文件,打开了它们,并检查了内部的代码以获取内存。最终,这个解决方案是我想到的,并且对我有用。我使用的是wordpress,因此此解决方案可能仅适用于wordpress内存大小限制问题。我的解决方案是,在/ public_html / wp-includes文件夹中打开default-constants.php文件。使用代码编辑器打开该文件,然后在作用域下找到内存设置,或者按住Ctrl + F组合键以找到单词“ memory”。在那里,你会过来和。只是增加它,在我的情况下是64 MB,我将其增加到128 MB,然后又增加到200 MB。wp_initial_constantsWP_MEMORY_LIMITWP_MAX_MEMORY_LIMIT

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

顺便说一句,请不要执行以下代码,因为这是不好的做法:

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

1
适用于wordpress网站,这些网站无法访问.htaccess和php.ini文件。+1
Mustafa sabir

我想说,更改“核心” WordPress文件的这些限制并不是一个好主意。您可以非常轻松地添加这些限制wp-config.php,以免将来的WordPress更新覆盖这些限制。此外,如果更改了“核心” WordPress文件,一些安全插件(例如WordFence)将抱怨…
Gwyneth Llewelyn

1
@GwynethLlewelyn我不知道该怎么做,请您详细说明一下?
garakchy

1
哦...只需在其中编辑wp-config.php并添加两行(即define( 'WP_MEMORY_LIMIT', '200M' );和)define( 'WP_MAX_MEMORY_LIMIT', '256M' );,与“核心” WP上的文件(即下方的所有内容wp-includes)不同,这些文件会被WP升级所覆盖,wp-config.php不会-在那儿正是覆盖WP常数的确切目的!
Gwyneth Llewelyn

1
“不良做法”是有条件的。-1适用于短期运行的流程。例如,用于运行单元测试或作曲家installs / etc的php构建器容器。只是不要运行带有这样的设置的生产站点。
emmdee

5

您可以通过在脚本中所有代码上方执行以下行来增加php脚本所允许的内存:

ini_set('memory_limit','-1'); // enabled the full memory available.

并在脚本中取消分配不需要的变量。

检查此php库:使用PHP释放内存



3

我注意到有很多答案,只是试图增加分配给有其位置的脚本的内存量,但更多的是,这意味着由于无法预料的数量或大小,某些东西的内存过于宽松。显然,如果您不是脚本的作者,那么您会受到作者的摆布,除非您感到野心勃勃:) PHP文档甚至说内存问题是由于“ 脚本编写不当 ”造成的。

应该提到的是 ini_set('memory_limit', '-1');(无限制)会导致服务器不稳定,因为0 bytes free = bad things。相反,应根据脚本尝试执行的操作以及计算机上的可用内存量来找到合理的平衡点。

更好的方法:如果您是脚本的创建者(或雄心勃勃的),则可以使用xdebug调试此类内存问题。最新版本(2.6.0-发布于2018-01-29)带回了内存配置文件,可向您显示哪些函数调用正在消耗大量内存。它暴露了脚本中很难找到的问题。通常,效率低下是在一个循环中,它并不期望接收到的容量大,但是每种情况都将留给读者练习:)

Xdebug的文档是有帮助的,但它归结为3个步骤:

  1. 安装 -可通过以下方式获得apt-getyum
  2. 配置它 -xdebug.ini:xdebug.profiler_enable = 1xdebug.profiler_output_dir = /where/ever/
  3. 使用QCacheGrindKCacheGrind之类的工具查看配置文件

2

如果您尝试读取文件,则会占用PHP的内存。例如,如果您尝试打开并读取MP3文件(例如$ data = file(“ http://mydomain.com/path/sample.mp3 ”),它将把所有内容都拉入内存。

正如Nelson所建议的,如果您确实需要使用这么多的内存,则可以增加最大内存限制。


2

我们有类似的情况,我们尝试在答案的顶部给出ini_set('memory_limit','-1'); 并且一切正常,压缩的图像文件大于1MB到KB。


1

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

在打开php标签后,在顶部的index.php中


1

在Wordpress中切换到新主题后,我收到相同的错误消息。PHP运行的是5.3版,因此我切换到7.2版。这解决了问题。


1

如果您使用共享主机,则将无法强制增加php大小限制。

只需转到您的cpanel并将您的php版本升级到7.1及更高版本,您就可以使用了。


0

WordPress用户添加行:

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

在wp-settings.php中,您可以在wordpress安装的根文件夹中找到


0

我没有更新主机,数据库是只读的。Joomla需要编写会话,但无法执行。


0

我在命令行中运行php时遇到了同样的问题。最近,我更改了php.ini文件,并在更改php.ini时犯了一个错误

这是针对php7.0

我出错的php.ini路径: /etc/php/7.0/cli/php.ini

我设置了memory_limit = 256(表示256 bytes
而不是memory_limit = 256M(表示256 Mega bytes)。

; 脚本可能消耗的最大内存量(128MB)
http://php.net/memory-limit
memory_limit = 128M

一旦纠正它,我的过程就会开始正常运行。



-1

如果您使用的是laravel,请使用这种方式

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

代替

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.