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

出现这个错误消息,有什么建议吗?

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

746658 次浏览

你的脚本占用了太多内存。在PHP中,如果有一个超出控制的循环,并且每次循环都要创建对象或向数组中添加内容,则经常会发生这种情况。

检查有无无限循环。

如果这不是问题,尝试通过将对象设置为null来销毁它们来帮助PHP。如。$OldVar = null;

还要检查实际发生错误的代码。你认为这一行会分配大量的内存吗?如果没有,试着找出哪里出了问题。

如果您试图读取一个文件,这将占用PHP中的内存。例如,如果你试图打开并读取一个MP3文件(比如,$data = file("http://mydomain.com/path/sample.mp3"),它将把它全部拉到内存中。

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

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

如果你的脚本是预期来分配这么大的内存,那么你可以通过在php文件中添加这一行来增加内存限制

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

其中44M是你预计消耗的量。

然而,大多数情况下这个错误消息意味着脚本有问题和增加内存限制只会导致相同的错误消息与不同的数字。

因此,您必须重写代码,而不是增加内存限制,这样它就不会分配那么多内存。例如,在较小的块中处理大量数据,取消保存大值但不再需要的变量,等等。

如果你想读大文件,你应该一点一点读,而不是一次读 这是一个简单的数学:如果您一次读取一个1mb大的文件,那么同时至少需要1mb的内存来保存数据

所以你应该使用fopen &fread

我们有一个类似的情况,我们尝试在答案的顶部给出 报错(' memory_limit ', ' 1 '); 一切工作正常,压缩图像文件大于1MB到KBs。< / p >

这里有两个简单的方法来增加共享主机的限制:

  1. 如果你可以访问你的PHP.ini文件,修改PHP.ini中的行 如果你的线显示为32M,试试64M: 李memory_limit = 64M ; Maximum amount of memory a script may consume (64MB) < / p > < / >

  2. 如果你没有PHP.ini的访问权限,试着把这个添加到。htaccess文件中: 李php_value memory_limit 64M < / p > < / >

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

在你的index.php在PHP标签打开后的顶部

Wordpress用户添加一行:

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

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

做的事情:

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;

你可以通过执行下面的代码来增加php脚本的内存:

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

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

我也有同样的问题,寻找phpinfo.ini, php.ini或.htaccess文件无效。最后,我查看了一些php文件,打开它们并检查了内存中的代码。最后,我想出了这个解决方案,它对我很有效。我使用wordpress,所以这个解决方案可能只适用于wordpress内存大小限制的问题。 我的解决方案,打开/ public_html / wp-includes文件夹中的default-constants.php文件。用代码编辑器打开该文件,并在wp_initial_constants范围内找到内存设置,或者只是按Ctrl+F找到单词“memory”。在那里你会看到WP_MEMORY_LIMITWP_MAX_MEMORY_LIMIT。只是增加它,在我的情况下它是64 MB,我增加到128 MB,然后到200 MB

// 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');

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

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

我有同样的问题,在命令行运行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)。

< p >;脚本可占用的最大内存(128MB)
http://php.net/memory-limit
memory_limit = 128M

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

在Wordpress中切换到一个新主题后,我收到了同样的错误信息。PHP运行的是5.3版本,所以我切换到了7.2。这解决了问题。

我注意到许多答案只是试图增加脚本的内存数量,但通常情况下,这意味着由于不可预见的容量或大小,某些东西对内存过于自由。显然,如果你不是脚本的作者,除非你觉得雄心勃勃,否则你要受作者的摆布:)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/ .ini
  3. QCacheGrindKCacheGrind等工具中查看配置文件

我在php7.2和laravel 5.6中遇到了同样的问题。我只是在php.ini中增加变量memory_limit = 128M的数量,因为我的应用程序需要。可能是256M/512M/1048M.....现在它工作得很好。

如果你正在使用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
}

如果使用共享主机,则不能强制增加php大小限制。

只要去你的cpanel和升级你的php版本到7.1以上,然后你就可以去了。

我想分享我在这个问题上的经验!

假设你有a类和B类。

class A {
protected $userB;


public function __construct() {
$this->userB = new B();
}
}


class B {
protected $userA;


public function __construct() {
$this->userA = new A();
}
}

这将启动一个对象链的形成,这可能会产生这种问题!

COMPOSER_MEMORY_LIMIT=-1 composer require mageplaza/module-core

Wordpress用户添加一行:

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

在cpanel中设置memory_limit为-1

enter image description here

我运行以下命令composer update,现在正在工作。如果这不能解决你的问题,增加你在php.ini文件中的memory_limit中的内存限制。