这个错误信息提示已经出现了,有什么建议吗?
在php中尝试分配43148176字节的内存时,已用尽33554432字节的允许内存大小。
这个错误信息提示已经出现了,有什么建议吗?
在php中尝试分配43148176字节的内存时,已用尽33554432字节的允许内存大小。
ini_set('memory_limit', '44M');
其中44M
是你预计要消耗的内存量。
然而,大多数情况下这个错误消息意味着脚本正在做一些不对的事情,增加内存限制只会导致相同的错误消息出现不同的数字。
因此,与其增加内存限制,你必须重写代码,使其不会分配那么多的内存。例如,将大量的数据分成小块来处理,取消不再需要的保存大型值的变量等。
以下是两种简单的方法来增加共享主机上的限制:
如果您可以访问PHP.ini文件,请更改PHP.ini中的这一行,如果您的这一行显示32M,请尝试将其改为64M:
memory_limit = 64M;脚本可使用的最大内存量(64MB)
如果您无法访问PHP.ini,请尝试将以下内容添加到.htaccess文件中:
php_value memory_limit 64M
您的脚本使用了过多的内存。如果您在PHP中有一个无限循环并且每次循环都创建对象或向数组添加元素,那么这种情况经常会发生。
检查是否存在无限循环。
如果不是这个问题,请通过将已完成的对象设置为null来帮助PHP销毁它们。例如:$OldVar = null;
同时,检查代码中实际发生错误的位置。您是否期望该行分配大量内存?如果不是,请尝试弄清楚出了什么问题...
正在进行:
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;
while
循环后面:fclose($file)
。 - kodeart我在使用laravel 5.6和php7.2时遇到了同样的问题。我只需将php.ini中的memory_limit = 128M
变量增加到符合我的应用程序要求的256M、512M或1048M等大小即可。现在它正常运行。
很遗憾,使用PHP编程时更容易消耗内存,而且比你意识到的要快。复制字符串、数组和对象而不使用引用会导致这种情况,尽管PHP 5比PHP 4更自动化处理此问题。但是将您的数据集完整地处理几个步骤也比一次处理最小逻辑单元浪费更多。经典例子是处理来自数据库的大型结果集:大多数程序员将整个结果集获取到数组中,然后使用foreach()
一次或多次遍历它。使用while()
循环一次获取并处理一行更具有内存效率。相同的情况也适用于处理文件。
如果你想读取大文件,应该逐位读取而不是一次性读取。
这是简单的数学问题:如果你一次性读取一个1MB的大文件,那么至少需要1MB的内存同时存储数据。
所以你应该使用fopen
和fread
逐位读取它们。
$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
- Avatarini_set('memory_limit','-1'); // enabled the full memory available.
wp_initial_constants
范围下查找内存设置,或者Ctrl+F查找单词“memory”。在那里,您将看到WP_MEMORY_LIMIT
和WP_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');
wp-config.php
上添加这些限制,这样它们就不会被未来的WordPress更新覆盖。
此外,一些安全插件(例如WordFence)会抱怨如果更改了“核心”WordPress文件... - Gwyneth Llewelynwp-config.php
并添加这两行代码(即define( 'WP_MEMORY_LIMIT', '200M' );
和define( 'WP_MAX_MEMORY_LIMIT', '256M' );
)。与“核心”WP下的文件(即wp-includes
下的所有文件)不同,这些文件将被WP升级覆盖,而wp-config.php
不会——它正是为了覆盖WP常量而存在的! - Gwyneth Llewelynini_set('memory_limit', '-1');
(无限制)可能会导致服务器不稳定,因为0字节空闲=糟糕的事情
。相反,通过脚本所要做的事情和机器上可用内存的数量找到一个合理的平衡。
更好的方法:如果您是脚本的作者(或有雄心壮志),可以使用xdebug调试此类内存问题。最新版本(2.6.0-发布于2018-01-29)重新引入了内存分析,显示消耗大量内存的函数调用。它会暴露脚本中难以找到的问题。通常,低效率出现在一个循环中,该循环无法处理其接收到的数据量,但每种情况都需要读者自行解决 :)
xdebug文档很有帮助,但归结为3个步骤:
apt-get
和yum
等方式获取 xdebug.profiler_enable = 1
, xdebug.profiler_output_dir = /where/ever/