php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)
Posted
技术标签:
【中文标题】php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)【英文标题】:Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php 【发布时间】:2010-09-29 18:29:53 【问题描述】:正在显示此错误消息,有什么建议吗?
允许的内存大小为 33554432 字节已用尽(试图分配 43148176 字节)在 php 中
【问题讨论】:
在 php.ini 文件中将最大内存限制增加到 64MB。 Google search 但我能问一下你为什么要分配这么多内存吗?它在哪一行代码失败? 脚本失败时在做什么?可以发一下代码吗? 看起来像一个非常大的 txt 文件。 通常,您一次读取一行可能较大或任意大小的文件,每读取一行都会覆盖前一行内存。或者,您可能只想尾随或引导文件以获取最新条目。随着文件的增长增加内存分配不是答案。 Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted (CodeIgniter + XML-RPC)的可能重复 【参考方案1】:您的脚本占用了太多内存。如果您有一个失控的循环并且您在循环的每次通过时创建对象或添加到数组中,这通常会在 PHP 中发生。
检查无限循环。
如果这不是问题,请尝试通过将已完成的对象设置为 null 来销毁对象来帮助 PHP。例如。 $OldVar = null;
检查错误实际发生的代码。您是否希望该行分配大量内存?如果没有,请尝试找出问题所在...
【讨论】:
我遇到了这个确切的问题 - 原来我无意中创建了一个递归函数 - 因此它在代码执行期间的任何随机时间都耗尽了内存。这让我现在拥有了世界上内存效率最高的代码,这是在寻找内存泄漏时创建的。 为了其他会追兔子的人。我认为 Symfony 中的教义与独白存在问题,当出现 PDO 异常时,它将创建一个无限循环的异常,因为它会尝试异常的异常,从而隐藏真正的问题(在我的情况下是损坏的 db 文件)。跨度> 【参考方案2】:如果你试图读取一个文件,这将占用 PHP 的内存。例如,如果您尝试打开并读取 MP3 文件(例如 $data = file("http://mydomain.com/path/sample.mp3" ),它会将其全部拉入内存。
正如 Nelson 建议的那样,如果您确实需要使用这么多内存,则可以努力增加最大内存限制。
【讨论】:
【参考方案3】:不幸的是,在 PHP 中以一种比您想象的更快消耗内存的方式进行编程很容易。复制字符串、数组和对象而不是使用引用就可以了,尽管 PHP 5 应该比 PHP 4 更自动地做到这一点。但是与处理最小的逻辑单元相比,通过几个步骤处理完整的数据集也很浪费一次。典型的例子是处理来自数据库的大型结果集:大多数程序员将整个结果集提取到一个数组中,然后使用foreach()
对其进行一次或多次循环。使用while()
循环一次获取和处理一行的内存效率要高得多。同样的事情也适用于处理文件。
【讨论】:
它似乎很可能就是这样做的。【参考方案4】:终于找到答案了:
只需将此行添加到您的 php 文件中出现错误的行之前
ini_set('memory_limit', '-1');
它会占用服务器无限的内存,它工作正常。
为了安全使用内存,请考虑使用 '44M'
而不是 '-1'
。
【讨论】:
您仍然应该检查为什么内存耗尽。也许您不需要阅读整个文件,也许可以按顺序阅读。 - @panidarapu 和 @Don Jones:根据内存量以及 如何 使用此脚本,允许在此脚本中更改内存使用可能很危险大大地。唐,在你的情况下,你可以将提要分解成更小的块并解析你需要的东西。很高兴它有效,但要小心。 这个建议对我有用。脚本中动态增加内存限制是通过函数 ini_set(): ini_set('memory_limit', '128M'); 伙计们,请不要进行这种快速修复。从长远来看,它会伤害你。作为一名优秀的程序员,您应该找出这种内存消耗背后的原因并根据需要增加而不是保留它UNLIMITED
。
哇,这个广受好评的答案对我来说似乎真的很糟糕。 -1!【参考方案5】:
如果你想读大文件,你应该一点一点地读,而不是一次读。 这很简单:如果您一次读取一个 1 MB 的大文件,那么同时至少需要 1 MB 的内存来保存数据。
所以你应该使用fopen
和fread
一点一点地阅读它们。
【讨论】:
通过使用解决了这个问题:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) print(fread($fh, $buffer)); flush(); fclose($fh);
【参考方案6】:
我们有类似的情况,我们尝试在答案的顶部给出 ini_set('memory_limit', '-1'); 一切正常,压缩图像文件大于 1MB 到 KB。
【讨论】:
【参考方案7】:以下是增加共享主机限制的两种简单方法:
如果您有权访问 PHP.ini 文件,请更改 PHP.ini 中的行
如果您的线路显示 32M,请尝试 64M:
memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)
如果您无权访问 PHP.ini,请尝试将其添加到 .htaccess 文件中:
php_value memory_limit 64M
【讨论】:
【参考方案8】:写
ini_set('memory_limit', '-1');
在您的 index.php 中打开 php 标签后的顶部
【讨论】:
【参考方案9】:wordpress 用户添加行:
@ini_set('memory_limit', '-1');
在 wp-settings.php 中,您可以在 wordpress 安装的根文件夹中找到该文件
【讨论】:
【参考方案10】:在做:
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;
【讨论】:
不敢相信所有这些人都建议将 memory_limit 设置为 -1... 在生产服务器上做的疯狂事情。感谢您提供更清洁的解决方案。 在“最佳实践”中,最好在while
循环之后关闭文件处理程序:fclose($file)
@assetCorp 如果文件具有例如 100MiB 并且 PHP 内存限制仍设置为 32 MiB,这有什么帮助。您通过 1MiB 的安全块读取它,然后将其附加到一个变量中,一旦循环达到 31. 迭代,该变量将使用所有可用内存。怎么样?仅输出类似的块而不需要将它们全部存储在一个变量中将有助于解决问题。【参考方案11】:
您可以通过在脚本中的所有代码上方执行以下行来增加允许 php 脚本的内存:
ini_set('memory_limit','-1'); // enabled the full memory available.
并且还取消分配脚本中不需要的变量。
【讨论】:
【参考方案12】:我也遇到了同样的问题,查找 phpinfo.ini、php.ini 或 .htaccess 文件无济于事。最后,我查看了一些 php 文件,打开它们并检查了里面的代码以获取内存。最后,这个解决方案是我提出的,它对我有用。我使用的是 wordpress,所以这个解决方案可能只适用于 wordpress 内存大小限制问题。
我的解决方案,打开 /public_html/wp-includes 文件夹中的 default-constants.php 文件。使用代码编辑器打开该文件,并在wp_initial_constants
作用域下找到内存设置,或者只需 Ctrl+F 即可找到“内存”一词。在那里你会过来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');
【讨论】:
适用于 .htaccess 和 php.ini 文件无法访问的 wordpress 网站。 +1 我想说,改变对“核心”WordPress 文件的限制并不是一个好主意。您可以非常轻松地在wp-config.php
上添加这些限制,它们不会被未来的 WordPress 更新覆盖。此外,如果“核心”WordPress 文件发生更改,一些安全插件(例如 WordFence)会报错...
@GwynethLlewelyn 我不知道该怎么做,请您详细说明一下吗?
哦...只需编辑wp-config.php
并在那里添加两行(即define( 'WP_MEMORY_LIMIT', '200M' );
和define( 'WP_MAX_MEMORY_LIMIT', '256M' );
。与“核心”WP 上的文件不同(即,所有内容都在wp-includes
),它将被 WP 升级覆盖,wp-config.php
不会——它的存在正是为了覆盖 WP 常量!
“不良做法”是情境性的。 -1
适用于短期运行的进程。例如,用于运行单元测试或作曲家安装/等的 php 构建器容器。只是不要以这样的设置运行您的生产站点。【参考方案13】:
我没有更新我的主机并且数据库是只读的。 Joomla 需要编写会话,但无法做到。
【讨论】:
【参考方案14】:ini_set('memory_limit', '-1');
【讨论】:
@Pang ini_set('memory_limit', '-1');【参考方案15】:我在命令行中运行 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
一旦我纠正了它,我的进程就开始运行良好了。
【讨论】:
【参考方案16】:在 Wordpress 中切换到新主题后,我收到了相同的错误消息。 PHP 运行的是 5.3 版,所以我切换到 7.2。这解决了问题。
【讨论】:
【参考方案17】:我注意到许多答案只是试图增加分配给有其位置的脚本的内存量,但通常这意味着由于不可预见的体积或大小,某些东西在内存方面过于宽松。显然,如果您不是脚本的作者,除非您有野心,否则您将受到作者的摆布:) PHP 文档甚至说内存问题是由于“poorly written scripts”
需要说明的是ini_set('memory_limit', '-1');
(无限制)和0 bytes free = bad things
一样会导致服务器不稳定。相反,请根据您的脚本尝试执行的操作和机器上的可用内存量找到合理的平衡。
更好的方法:如果您是该脚本的作者(或雄心勃勃),您可以使用 xdebug 调试此类内存问题。最新版本(2.6.0 - 2018-01-29 发布)带回了内存分析,显示哪些函数调用正在消耗大量内存。它暴露了脚本中很难找到的问题。通常,效率低下是在一个不期望接收量的循环中,但每个案例都将留给读者作为练习:)
xdebug documentation 很有帮助,但归结为 3 个步骤:
-
Install It - 可通过
apt-get
和yum
等获得
Configure it - xdebug.ini: xdebug.profiler_enable = 1
, xdebug.profiler_output_dir = /where/ever/
在QCacheGrind、KCacheGrind 等工具中查看配置文件
【讨论】:
【参考方案18】:我在使用 laravel 5.6 的 php7.2 中遇到了同样的问题。我只是根据应用程序的需要增加 php.ini 中变量 memory_limit = 128M
的数量。可能是256M/512M/1048M.....现在可以正常使用了。
【讨论】:
【参考方案19】:如果你使用的是 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
【讨论】:
【参考方案20】:在您的 Magento 根目录 php -d memory_limit=4G bin/magento
中运行此命令
【讨论】:
【参考方案21】:如果您使用共享主机,您将无法强制增加 php 大小限制。
只需转到您的 cpanel 并将您的 php 版本升级到 7.1 及更高版本即可。
【讨论】:
我在 7.4,仍然面对。 当我将 php 升级到 7.1 时问题已解决。你能试试 php 7.1 还是 7.2【参考方案22】:我想分享我在这个问题上的经验!
假设你有 A 类和 B 类。
class A
protected $userB;
public function __construct()
$this->userB = new B();
class B
protected $userA;
public function __construct()
$this->userA = new A();
这将启动可能造成此类问题的对象链形成!
【讨论】:
【参考方案23】:COMPOSER_MEMORY_LIMIT=-1 composer require mageplaza/module-core
【讨论】:
【参考方案24】:wordpress 用户添加行:
@ini_set('memory_limit', '-1');
或
在 cpanel 中将 memory_limit 设置为 -1
【讨论】:
以上是关于php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 的 CheckForMaintenanceMode 中间件中允许的内存大小耗尽