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

pan*_*apu 270 php memory-management memory-limit

正在显示此错误消息,有任何建议吗?

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

pan*_*apu 305

最后我找到了答案:

只需将以下行添加到您在文件中收到错误的行之前

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

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

感谢您提供建议的朋友.

  • 你仍然应该检查*为什么*内存耗尽.也许你不需要阅读整个文件,也许你可以顺序阅读它. (124认同)
  • 哇,这个大肆宣传的答案对我来说似乎真的很糟糕.-1! (107认同)
  • 伙计们,请不要去快速解决这个问题.从长远来看,它可能会伤害到你.作为一名优秀的程序员,你应该弄清楚这种内存消耗背后的原因并根据需要增加而不是保持"无限制". (34认同)
  • - @panidarapu和@Don Jones:根据内存量和*如何使用此脚本,以这种方式允许更改内存使用量可能会很危险.唐,在你的情况下,你可以将饲料分解成更小的块并解析你需要的东西.很高兴它有效,但要小心. (8认同)
  • 这个建议对我有用.通过函数ini_set()动态增加脚本中的内存限制:ini_set('memory_limit','128M'); (5认同)
  • 这是一个坏主意,可能会使您的服务器通过大型数据帖子遭受恶意攻击. (4认同)

小智 57

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

  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


Rik*_*ood 44

您的脚本使用了太多内存.如果您的循环已经失控并且您正在创建对象或在循环的每次传递中添加到数组,这通常可以在PHP中发生.

检查无限循环.

如果这不是问题,请尝试通过将它们设置为null来销毁已完成的对象来帮助PHP.例如.$OldVar = null;

检查错误实际发生的代码.您是否希望该线路分配大量内存?如果没有,试着弄清楚出了什么问题......

  • 我有这个确切的问题 - 结果我无意中创建了一个递归函数 - 因此它在代码执行期间的任何随机时间都耗尽了内存.这有点我现在拥有世界上最高效的内存代码,在寻找内存泄漏时创建. (3认同)

ass*_*orp 36

做:

ini_set('memory_limit', '-1');
Run Code Online (Sandbox Code Playgroud)

永远不会好.如果要读取非常大的文件,最好一点一点地复制它.请尝试以下代码以获得最佳实践.

$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;
Run Code Online (Sandbox Code Playgroud)

  • 无法相信所有这些人都建议将memory_limit设置为-1 ...在生产服务器上做疯狂的事情.感谢更清洁的解决方案. (5认同)
  • 在"最佳实践"中,最好在`while`循环之后关闭文件处理程序:`fclose($ file)` (2认同)
  • @assetCorp如果文件具有例如100MiB并且PHP内存限制仍设置为32 MiB,则如何提供帮助。您可以通过1MiB的安全块读取它,然后将其附加到一个变量中,该变量将在循环达到31.迭代时使用所有可用内存。有什么更好的办法吗?仅输出类似的块而不要求将它们全部存储在一个变量中将有助于解决该问题。 (2认同)

sta*_*san 17

不幸的是,很容易在PHP中编程,以比你意识到的更快地消耗内存.复制字符串,数组和对象而不是使用引用会做到这一点,尽管PHP 5应该比PHP 4更自动地执行此操作.但与处理最小的逻辑单元相比,在几个步骤中完整地处理数据集也是浪费一次.经典的例子是使用来自数据库的大型结果集:大多数程序员将整个结果集提取到一个数组中,然后用它循环一次或多次foreach().使用while()循环一次获取和处理一行是更高效的内存.同样的事情适用于处理文件.


Gum*_*mbo 13

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

所以你应该用fopen&一点一点地阅读它们fread.


Zia*_*man 9

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


gar*_*chy 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' );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ini_set('memory_limit', '-1');
Run Code Online (Sandbox Code Playgroud)


小智 6

ini_set('memory_limit', '-1');
Run Code Online (Sandbox Code Playgroud)

  • @Pang ini_set('memory_limit', '-1'); (3认同)

Sea*_*ney 6

我注意到许多答案只是试图增加分配给有其位置的脚本的内存量,但通常这意味着由于无法预料的体积或大小而导致内存过于宽松。显然,如果您不是脚本的作者,除非您感到雄心勃勃,否则您将受到作者的摆布:) PHP 文档甚至说内存问题是由于“脚本编写不当”造成的

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

更好的方法:如果您是脚本的作者(或雄心勃勃的),您可以使用xdebug调试此类内存问题。最新版本(2.6.0 - 2018 年 1 月 29 日发布)带回了内存分析,显示哪些函数调用正在消耗大量内存。它暴露了脚本中很难找到的问题。通常,低效率处于一个循环中,它不期望收到的数量,但每个案例都将留给读者作为练习:)

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

  1. 安装它-可通过apt-getyum
  2. 配置它- xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. QCacheGrindKCacheGrind等工具中查看配置文件


San*_*N S 5

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

ini_set('memory_limit','-1'); // enabled the full memory available.
Run Code Online (Sandbox Code Playgroud)

并且还在脚本中分配不需要的变量.

检查这个php库:用PHP释放内存