出现这个错误消息,有什么建议吗?
允许内存大小为33554432字节已耗尽(已尝试分配 43148176字节)的PHP
出现这个错误消息,有什么建议吗?
允许内存大小为33554432字节已耗尽(已尝试分配 43148176字节)的PHP
你的脚本占用了太多内存。在PHP中,如果有一个超出控制的循环,并且每次循环都要创建对象或向数组中添加内容,则经常会发生这种情况。
检查有无无限循环。
如果这不是问题,尝试通过将对象设置为null来销毁它们来帮助PHP。如。$OldVar = null;
还要检查实际发生错误的代码。你认为这一行会分配大量的内存吗?如果没有,试着找出哪里出了问题。
如果您试图读取一个文件,这将占用PHP中的内存。例如,如果您试图打开并读取一个MP3文件(例如,$data = file("http://mydomain.com/path/sample.mp3")),它将把它全部拉到内存中。
正如Nelson所建议的,如果您确实需要使用这么多内存,您可以提高您的最大内存限制。
It is unfortunately easy to program in PHP in a way that consumes memory faster than you realise. Copying strings, arrays and objects instead of using references will do it, though PHP 5 is supposed to do this more automatically than in PHP 4. But dealing with your data set in entirety over several steps is also wasteful compared to processing the smallest logical unit at a time. The classic example is working with large resultsets from a database: most programmers fetch the entire resultset into an array and then loop over it one or more times with foreach(). It is much more memory efficient to use a while() loop to fetch and process one row at a time. The same thing applies to processing a file.
如果您的脚本需要分配这么大的内存,那么您可以通过在php文件中添加这一行来增加内存限制
ini_set('memory_limit', '44M');
其中,4400万是你预计消费的数量。
但是,大多数情况下,此错误消息意味着脚本正在做错误的事情,增加内存限制只会导致相同的错误消息,但数字不同。
因此,您必须重写代码,而不是增加内存限制,这样它就不会分配那么多内存。例如,在较小的块中处理大量数据,取消保存大值但不再需要的变量,等等。
如果你想读取大文件,你应该一点一点地读取,而不是一次读取。 这是一个简单的数学:如果您一次读取一个1mb大的文件,那么同时至少需要1mb的内存来保存数据。
所以你应该使用fopen & fread一点一点地阅读它们。
这里有两个简单的方法来增加共享主机的限制:
如果您可以访问PHP.ini文件,请更改PHP.ini中的行 如果你的线显示为32M,试试64M: memory_limit = 64M;一个脚本可能消耗的最大内存(64MB) 如果你不能访问PHP.ini,试着把这个添加到。htaccess文件中: php_value memory_limit 64M
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.
并且在脚本中取消分配不需要的变量。
I was also having the same problem, looked for phpinfo.ini, php.ini or .htaccess files to no avail. Finally I have looked at some php files, opened them and checked the codes inside for memory. Finally this solution was what I come out with and it worked for me. I was using wordpress, so this solution might only work for wordpress memory size limit problem. My solution, open default-constants.php file in /public_html/wp-includes folder. Open that file with code editor, and find memory settings under wp_initial_constants scope, or just Ctrl+F it to find the word "memory". There you will come over WP_MEMORY_LIMIT and WP_MAX_MEMORY_LIMIT. Just increase it, it was 64 MB in my case, I increased it to 128 MB and then to 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');
我有同样的问题,在命令行运行php。最近,我更改了php.ini文件,在更改php.ini时犯了一个错误
这是针对php7.0的
到php.ini的路径:/etc/php/7.0/cli/php.ini
我设置了memory_limit = 256(这意味着256字节),而不是memory_limit = 256M(这意味着256兆字节)。
; 脚本可能消耗的最大内存(128MB) ; http://php.net/memory-limit memory_limit = 128M
一旦我纠正了它,我的过程开始正常运行。
我注意到许多答案只是试图增加脚本的内存数量,但通常情况下,这意味着由于不可预见的容量或大小,某些东西对内存过于自由。显然,如果你不是脚本的作者,除非你有野心,否则你要受作者的摆布:)PHP文档甚至说内存问题是由于“写得不好的脚本”。
值得一提的是,ini_set('memory_limit', '-1');(无限制)会导致服务器不稳定,因为0字节空闲=坏事。相反,要根据脚本要做的事情和机器上可用的内存数量找到一个合理的平衡。
一个更好的方法是:如果您是脚本的作者(或雄心勃勃),您可以使用xdebug调试此类内存问题。最新版本(2.6.0 -发布2018-01-29)带回了内存分析,显示哪些函数调用消耗了大量内存。它暴露了脚本中难以找到的问题。通常情况下,低效率是在一个循环中,它不期望它接收到的容量,但每种情况都将留给读者作为练习:)
xdebug文档很有帮助,但它可以归结为3个步骤:
安装它-可通过apt-get和yum等 配置它- xdebug.ini: xdebug。Profiler_enable = 1, xdebug。Profiler_output_dir = /where/ever/ 在QCacheGrind、KCacheGrind等工具中查看配置文件
我在php7.2和laravel 5.6中遇到了同样的问题。我只是增加变量memory_limit = 128M在php.ini的数量作为我的应用程序的需求。可能是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
}
我想分享我在这个问题上的经验!
假设你有a类和B类。
class A {
protected $userB;
public function __construct() {
$this->userB = new B();
}
}
class B {
protected $userA;
public function __construct() {
$this->userA = new A();
}
}
这将启动一个对象链的形成,这可能会产生这种问题!