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

时间:2009-01-06 08:18:29

标签: php memory-management memory-limit

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

  

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

24 个答案:

答案 0 :(得分:292)

最后我找到了答案:

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

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

它将占用服务器的无限内存,它工作正常。

感谢您提供建议的朋友。

答案 1 :(得分:56)

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

  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

答案 2 :(得分:42)

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

检查无限循环。

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

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

答案 3 :(得分:34)

做:

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;

答案 4 :(得分:16)

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

答案 5 :(得分:13)

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

所以你应该使用fopen&amp ;; fread

答案 6 :(得分:7)

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

答案 7 :(得分:6)

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

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

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

检查这个php库:Freeing memory with PHP

答案 8 :(得分:4)

我也有同样的问题,查找phpinfo.ini,php.ini或.htaccess文件无济于事。最后我看了一些php文件,打开它们并检查内存中的代码。最后,这个解决方案就是我提出来的,它对我有用。我使用wordpress,所以这个解决方案可能只适用于wordpress内存大小限制问题。 我的解决方案是在 / public_html / wp-includes 文件夹中打开 default-constants.php 文件。使用代码编辑器打开该文件,在wp_initial_constants范围内查找内存设置,或者只需按Ctrl + F即可找到“内存”一词。在那里,您将来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');

答案 9 :(得分:3)

我们有类似的情况,我们在答案的顶部尝试了 ini_set('memory_limit',' - 1'); 并且一切正常,压缩的图像文件大于1MB到KB。

答案 10 :(得分:2)

如果您正在尝试读取文件,那将占用PHP中的内存。例如,如果您尝试打开并读取MP3文件(例如,$ data = file(“http://mydomain.com/path/sample.mp3”),则会将其全部存入内存。

正如尼尔森建议的那样,如果你真的需要使用这么多内存,你可以努力增加你的最大内存限制。

答案 11 :(得分:2)

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

答案 12 :(得分:1)

我没有更新我的托管,数据库是只读的。 Joomla需要编写会话并且无法完成。

答案 13 :(得分:1)

如果您使用共享主机,则将无法强制增加php大小限制。

只需转到您的cpanel并将您的php版本升级到7.1及更高版本,您就可以使用了。

答案 14 :(得分:1)

我注意到许多答案只是试图增加给予一个有其位置的脚本的内存量,但更多时候这意味着由于数量不确定的音量或大小而导致内存过于宽松。显然,如果你不是剧本的作者,除非你感到雄心勃勃,否则你会受到作者的支配:) PHP文档甚至说内存问题归因于“poorly written scripts

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

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

xdebug documentation很有用,但归结为3个步骤:

  1. Install It - 可通过apt-getyum
  2. 获取
  3. Configure it - xdebug.ini:xdebug.profiler_enable = 1xdebug.profiler_output_dir = /where/ever/
  4. 使用QCacheGrindKCacheGrind
  5. 等工具查看个人资料

答案 15 :(得分:1)

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

答案 16 :(得分:1)

wordpress用户添加行:

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

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

答案 17 :(得分:1)

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

在打开php标签后,在你的index.php中的

答案 18 :(得分:0)

我遇到了在命令行中运行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

我纠正后,我的流程开始运行良好。

答案 19 :(得分:0)

将服务器切换到php 7.x解决了我的问题

答案 20 :(得分:0)

如果您使用的是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 }

答案 21 :(得分:0)

在您的Magento根目录const scripts = ['https://www.gstatic.com/firebasejs/6.2.0/firebase-storage.js', 'https://www.gstatic.com/firebasejs/6.2.0/firebase-firestore.js', 'https://www.gstatic.com/firebasejs/6.2.0/firebase-app.js'] let count = 0 const recursivelyAddScript = (script, cb) => { const el = document.createElement('script') el.src = script if(count < scripts.length) { count ++ el.onload = recursivelyAddScript(scripts[count]) document.body.appendChild(el) } else { console.log('All script loaded') return } } recursivelyAddScript(scripts[count])

中运行此命令

答案 22 :(得分:0)

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

假设你有一个 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 :(得分:0)

COMPOSER_MEMORY_LIMIT=-1 composer require mageplaza/module-core