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


279

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

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


5
php.iniファイルの最大メモリ制限を64MBに増やします。グーグル検索しかし、なぜあなたがそんなに多くのメモリを割り当てようとしているのかと尋ねてもいいですか?どのコード行で失敗しますか?

1
失敗した場合、スクリプトは何をしていますか?コードを投稿できますか?
Neil Aitken、

3
非常に巨大なtxtファイルのように見えます。
macbirdie 2009年

10
従来、潜在的に大きいまたは任意のサイズのファイルを一度に1行ずつ読み取り、各行を読み取るたびに前の行のメモリを上書きしていました。または、最新のエントリを取得するためにファイルをテールまたはヘッドしたい場合もあります。ファイルが大きくなるにつれてメモリ割り当てを増やすことは、答えではありません。
ekerner、

回答:


317

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

あなたのファイルでエラーが発生する前の行にこれを追加してください

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

サーバーのメモリ使用量は無制限ですが、正常に動作しています。

提案の友人を与えてくれてありがとう。


125
メモリが使い果たされた理由を確認する必要あります。たぶん、ファイル全体を読み取る必要はなく、順次読み取ることもできます。
macbirdie 2009年

8
-@panidarapuおよび@Don Jones:メモリの量とこのスクリプトの使用方法によっては、この方法でメモリ使用量の変更を許可するのは危険な場合があります。ドン、あなたのケースでは、フィードをより小さなチャンクに分割し、必要なものを解析することができます。機能してうれしいですが、注意してください。
匿名の臆病者

5
この提案は私にとってうまくいきました。スクリプトで動的に増加するメモリ制限は、関数ini_set()を介して行われます。ini_set( 'memory_limit'、 '128M');
メンテ

37
みんな、このクイックフィックスに行かないでください。長期的にはあなたを傷つける可能性があります。優れたプログラマーとして、このメモリ消費の背後にある理由を把握し、必要に応じてそれを維持するのではなく増やす必要がありUNLIMITEDます。
Sumoanand 2013年

113
うわー、この非常に賛成された答えは私にとって本当に悪い習慣のようです。-1!
Ambidex 2013年

59

共有ホスティングの制限を増やす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


47

スクリプトが使用しているメモリが多すぎます。これは、制御不能になったループがあり、ループの各パスでオブジェクトを作成したり配列に追加したりしている場合、PHPでよく発生します。

無限ループをチェックします。

それが問題でない場合は、最後にオブジェクトをnullに設定して破棄することで、PHPを手助けしてください。例えば。$OldVar = null;

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


3
私はこの正確な問題を抱えていました-誤って再帰関数を作成したことが判明したため、コード実行中のランダムな時点でメモリが不足しました。これには、メモリリークを探すために作成された、世界で最もメモリ効率の高いコードを使用できるという利点がありました。
Kris Selbekk 2013年

1
穴をうさぎを追いかける人のために。SymfonyのDoctrineはモノログに問題があると思います。PDO例外があると例外の無限ループが発生し、例外の例外が試行されるため、実際の問題(私の場合は破損したdbファイル)が隠されます。
Desslav Kamenov

39

実行:

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;

6
memory_limitを-1に設定することを推奨するこれらすべての人々を信じることはできません...実動サーバーで実行するのはクレイジーです。よりクリーンな解決策をありがとう。
JohnWolf、2015年

2
一方で「ベスト・プラクティス」で、それは後にファイルハンドラを閉じるために良いですwhileループ:fclose($file)
kodeart

2
@assetCorpたとえば、ファイルに100MiBがあり、PHPのメモリ制限が32 MiBに設定されている場合、これはどのように役立ちますか。1MiBの安全なチャンクで読み取りますが、ループが31に達すると、利用可能なすべてのメモリを使用する変数に追加します。どうですか?それらをすべて1つの変数に格納する必要がないように、チャンクを同様に出力することだけが問題の解決に役立ちます。
2018

17

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


これがそれを行うことである可能性が高いようです。
Kzqai 2016年

13

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

したがって、fopen&を使用して少しずつ読み取る必要がありますfread


1
これを使用してこれを解決しました:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack

12

私はphp7.2とlaravel 5.6で同じ問題に直面しました。memory_limit = 128Mアプリケーションの要求に応じて、php.ini の変数の量を増やします。256M / 512M / 1048Mかもしれません。


6

私も同じ問題を抱えており、phpinfo.ini、php.ini、または.htaccessファイルを探しましたが、役に立ちませんでした。最後に、いくつかのphpファイルを確認し、それらを開いて、メモリ内のコードを確認しました。最後に、この解決策は私が思いついたものであり、私にとってはうまくいきました。私はワードプレスを使用していたため、このソリューションはワードプレスのメモリサイズ制限の問題に対してのみ機能する可能性があります。私の解決策は、default-constants.phpファイルを / public_html / wp-includesフォルダーのます。コードエディターでそのファイルを開き、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');

1
.htaccessファイルとphp.iniファイルにアクセスできないワードプレスのWebサイトで動作します。+1
ムスタファサビール2017年

「コア」WordPressファイルのこれらの制限を変更することは、本当に良い考えではないと思います。wp-config.php代わりに、これらの制限を非常に簡単に追加できます。この制限は、将来のWordPressの更新によって上書きされません。また、いくつかのセキュリティプラグイン(たとえば、WordFenceなど)は、「コア」WordPressファイルが変更された場合に問題を報告します...
Gwyneth Llewelyn

1
@GwynethLlewelynどうすればいいのかわからないのですが、詳しく説明してもらえますか?
ガラッキー

1
ああ...ちょうどwp-config.php2行を編集して追加します(つまりdefine( 'WP_MEMORY_LIMIT', '200M' );define( 'WP_MAX_MEMORY_LIMIT', '256M' );。「コア」WPのファイル(つまり、の下にあるすべてのものwp-includes)とは異なり、WPのアップグレードによって上書きされwp-config.phpません—正確にそこにありますWP定数をオーバーライドする正確な目的!
グウィネス・ルウェリン

1
「悪い習慣」は状況に応じたものです。-1短期間のプロセスには問題ありません。たとえば、単体テストまたはcomposerインストールなどの実行に使用されるphpビルダーコンテナー。このように設定した状態で運用サイトを実行しないでください。
emmdee

5

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

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

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

このphpライブラリを確認してください:PHPでメモリを解放する



3

多くの答えは、その場所にあるスクリプトに与えられるメモリの量を増やすことを試みているだけですが、多くの場合、予期しない量またはサイズのために、何かがメモリに対して自由になりすぎていることを意味します。明らかに、スクリプトの作成者でない場合は、野心的な気持ちでない限り、作成者のなすがままになります:) PHPのドキュメントでは、メモリの問題は「不十分に書かれたスクリプトが原因である」とさえ言っています

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

より良いアプローチ:スクリプトの作成者(または野心家)であれば、xdebugを使用してこのようなメモリの問題をデバッグできます。最新バージョン(2.6.0-2018年1月29日リリース)では、どの関数呼び出しが大量のメモリを消費しているかを示すメモリプロファイリングが復活しました。他の方法では見つけるのが難しいスクリプトの問題を公開します。通常、非効率性はループが受信しているボリュームを期待していないループにありますが、それぞれのケースは読者への課題として残されます:)

xdebugのドキュメントは便利ですが、それは3つの段階に沸きます:

  1. インストール - apt-getおよびから入手可能yumなど
  2. それを設定 - xdebug.ini: xdebug.profiler_enable = 1xdebug.profiler_output_dir = /where/ever/
  3. 以下のようなツールでプロファイルを見るQCacheGrindKCacheGrind

2

ファイルを読み取ろうとすると、PHPでメモリを消費します。たとえば、MP3ファイルを開いて読み取ろうとしている場合(たとえば、$ data = file( " http://mydomain.com/path/sample.mp3 ")のように、すべてをメモリにプルします。 。

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


2

同様の状況があり、回答の先頭にあるini_set( 'memory_limit'、 '-1');を試してみました。そして、すべてが1MBからKBまでの圧縮された画像ファイルで正常に機能しました。


1

書く

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

phpタグを開いた後の上部にあるindex.php


1

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


1

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

ちょうどあなたのcpanelに行き、あなたのphpのバージョンを7.1以上にアップグレードしたら、あなたは行ってもいいです。


0

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

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

WordPressのインストールされたルートフォルダーにあるwp-settings.php


0

ホスティングを更新しておらず、データベースは読み取り専用でした。Joomlaはセッションを作成する必要があり、それを実行できませんでした。


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

修正すると、プロセスが正常に動作し始めました。



-1

あなたが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 }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.