web-dev-qa-db-ja.com

phpで許容される33554432バイトのメモリサイズを使い果たしました(43148176バイトを割り当てようとしました)

このエラーメッセージが表示されています。何か提案はありますか?

Phpで許容される33554432バイトのメモリサイズを使い果たしました(43148176バイトを割り当てようとしました)

260
panidarapu

ついに私は答えを見つけました:

あなたのファイルの前にエラーが発生する前の行にこの下の行を追加するだけです。

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

それはサーバーの無制限のメモリ使用量がかかります、それはうまく機能しています。

提案の友達をくれてありがとう。

294
panidarapu

共有ホスティングの制限を増やす2つの簡単な方法は次のとおりです。

  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

56
Haider Abbas

あなたのスクリプトはあまりにも多くのメモリを使用しています。これはPHPで頻繁に起こり得ます。あなたが暴走したループがあり、ループを通過するたびにオブジェクトを作成したり配列に追加したりする場合です。

無限ループを調べます。

それでも問題が解決しない場合は、終了したオブジェクトをnullに設定して破棄することでPHPを実行してみてください。例えば。 $OldVar = null;

実際にエラーが発生したコードも確認してください。その行が大量のメモリを割り当てていると思いますか。そうでない場合は、何が問題なのかを調べてみてください。

42
Rik Heywood

やること:

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;
34
assetCorp

残念ながらPHPにプログラムするのは、あなたが思っているよりも早くメモリを消費するような方法では簡単です。 PHP 5はPHP 4よりも自動的にこれを実行するはずですが、参照を使用する代わりに文字列、配列、およびオブジェクトをコピーすることでそれを実行します。一度に最小の論理ユニットを処理するのに比べて、いくつかのステップも無駄になります。古典的な例はデータベースから大きな結果セットを扱うことです。ほとんどのプログラマーは結果セット全体を配列にフェッチしてからforeach()でそれを1回以上ループします。一度に1行ずつフェッチして処理するためにwhile()ループを使用する方がはるかにメモリ効率が良いです。同じことがファイルの処理にも当てはまります。

16
staticsan

大きなファイルを読みたい場合は、一度に読み込むのではなく、少しずつ読み込む必要があります。
簡単な計算です。一度に1 MBの大きなファイルを読み込むと、データを保持するために少なくとも1 MBのメモリが必要になります。

そのため、fopenfreadを使って少しずつそれらを読むべきです。

13
Gumbo

私はphra7.2でもlaravel5.6と同じ問題に直面しました。私のアプリケーションの要求に応じて、php.iniの変数memory_limit = 128Mの量を増やすだけです。それは256M/512M/1048Mかもしれません.....今それはうまく働きます。

7
Ziaur Rahman

スクリプト内のすべてのコードの上で次の行を実行すると、phpスクリプトに許可されているメモリを増やすことができます。

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

また、スクリプト内の不要な変数を割り当て解除します。

このphpライブラリをチェックしてください。 PHPでメモリを解放する

6

私も同じ問題を抱えていた、無駄にphpinfo.ini、php.iniまたは.htaccessファイルを探しました。最後に私はいくつかのphpファイルを見て、それらを開いて、メモリのために内部のコードをチェックしました。最後に、この解決策は私が出てきたものであり、それは私のために働きました。私はワードプレスを使用していたので、この解決策はワードプレスのメモリサイズ制限の問題に対してのみ有効かもしれません。私の解決策は、/ public_html/wp-includesフォルダにあるdefault-constants.phpファイルを開くことです。そのファイルをコードエディタで開き、wp_initial_constantsスコープの下のメモリ設定を見つけるか、単にCtrl + FでWordの「メモリ」を探します。 WP_MEMORY_LIMITWP_MAX_MEMORY_LIMITが登場します。ちょうどそれを増やしてください、それは私の場合64MBでした、私はそれを128MBそしてそれから200MBに増やしました。

// 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');
4
garakchy

私たちも同じような状況にあり、答えの先頭にini_set( 'memory_limit'、 '-1')を付けて試しました。そして、すべてが1MBを超えるKBまでの圧縮された画像ファイルで問題なく動作しました。

3
dynamicflow

あなたがファイルを読み込もうとしているならば、それはPHPのメモリを占有します。たとえば、MP3ファイルを開いて読み込もうとしている場合($ data = file( " http://mydomain.com/path/sample.mp3 ")それをすべてメモリに格納しようとしています。

Nelsonが示唆しているように、実際にこれだけのメモリを使用する必要がある場合は、最大メモリ制限を増やすようにすることができます。

2
Beau Simensen
ini_set('memory_limit', '-1');

Wordpressで新しいテーマに切り替えた後も同じエラーメッセージが表示されました。 PHPはバージョン5.3を実行していたので、7.2に切り替えました。これで問題は解決しました。

1
DavGarcia

ワードプレスのユーザーは、行を追加します。

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

wp-settings.phpでは、wordpressのインストールルートフォルダにあります。

1
Praveesh P

書きます

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

phpタグを開いた後の一番上のindex.phpに

1
Prafull

私はホスティングを更新しておらず、データベースは読み取り専用でした。 Joomlaはセッションを書く必要がありましたができませんでした。

1
Alberto M

私は多くの答えがただその場所を持つスクリプトに与えられたメモリの量を増やすことを試みることに気づくが、それは何よりもそれが何かが予想外の量のボリュームまたはサイズのためにメモリを余りにも自由にしすぎていることを意味する。あなたがスクリプトの作者ではないのであれば、あなたが野心的な気持ちでない限り作者のなすがままになります:) PHPドキュメントでさえ、メモリの問題は ""

ini_set('memory_limit', '-1');(制限なし)は0 bytes free = bad thingsとしてサーバーを不安定にする可能性があることに注意してください。代わりに、スクリプトが実行しようとしていることと、マシン上で使用可能なメモリの量によって、妥当なバランスを見つけてください。

より良いアプローチ:もしあなたがスクリプトの作者であれば(あるいは野心的であれば)、 xdebug でそのようなメモリ問題をデバッグできます。最新バージョン(2.6.0 - 2018-01-29リリース)は、どのような関数呼び出しが大量のメモリを消費しているかを示すメモリプロファイリングを復活させました。それは、そうでなければ見つけるのが難しいスクリプトの問題を明らかにします。通常、非効率性はそれが受け取るボリュームを期待していないループにあります、しかし各々のケースは読者への課題として残されるでしょう:)

xdebugのドキュメント は役立ちますが、3つのステップにまとめられています。

  1. インストールしてください - apt-getおよびyum etcから入手可能
  2. 設定する - xdebug.ini:xdebug.profiler_enable = 1xdebug.profiler_output_dir = /where/ever/
  3. QCacheGrindKCacheGrind のようなツールでプロファイルを表示します。
1
SeanDowney

コマンドラインで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

それを修正すると、私のプロセスは問題なく動作し始めました。

0
theBuzzyCoder

私の場合、サーバーをphp 7.xに切り替えると問題が解決しました

0
Tech Nomad

共有ホスティングを使用している場合、PHPサイズ制限の増分を強制することはできません。

Cpanelに移動して、phpバージョンを7.1以降にアップグレードしてから、準備完了です。

0
successtar

Magentoルートディレクトリでこのコマンドを実行しますphp -d memory_limit=4G bin/magento

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 }

0
Ajay