致命的なエラー:許容メモリサイズ134217728バイトが使い果たされました(CodeIgniter + XML-RPC)

2009年02月18日に質問されました。  ·  閲覧回数 1.4M回  ·  ソース

ArcticZero picture
2009年02月18日

私は、新しい販売データを1つの集中型データベースに定期的に送信するクライアントPOS(Point of Sale)システムを多数持っています。このデータベースは、レポート生成のためにデータを1つの大きなデータベースに保存します。

クライアントPOSはPHPPOSに基づいており、標準のXML-RPCライブラリを使用して販売データをサービスに送信するモジュールを実装しました。 サーバーシステムはCodeIgniter上に構築されており、WebサービスコンポーネントにXML-RPCおよびXML-RPCSライブラリを使用します。 大量の販売データ(salesテーブルから50行、sales内の各アイテムに関連するsales_itemsからの個々の行)を送信するたびに、次のエラーが発生します。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

php.iniのデフォルト値は128Mですが、これは非常に大きな数字だと思います。 実際、私はこの値を1024Mに設定しようとしましたが、エラーが発生するまでに時間がかかるだけです。

私が行った手順については、サーバー側ですべての処理を無効にしてみて、入力に関係なく返信定型文を返すように設定しました。 しかし、問題は実際のデータ送信にあると思います。 PHPの最大スクリプト実行時間を無効にしようとしましたが、それでもエラーが発生します。

回答

Jeff picture
2013年09月06日
722

memory_limitini_set('memory_limit', '-1');で変更すること、適切な解決策ではあり

PHPコードのどこかにメモリリークがあり、サーバーに必要なすべてのメモリを使用するように指示している可能性があります。 あなたはその問題を全く修正しなかっただろう。 サーバーを監視すると、サーバーがRAMの大部分を使い果たしており、ディスクにスワップしていることがわかります。

おそらく、コード内の問題のあるコードを追跡して修正する必要があります。

Chris Lane picture
2011年10月26日
213

ini_set('memory_limit', '-1');は、デフォルトのPHPメモリ制限を上書きします。

Basav picture
2013年03月21日
133

正しい方法は、 php.iniファイルを編集することです。 memory_limitを希望の値に編集します。

あなたの質問からのように、 128M (デフォルトの制限)を超えているので、それほど多くはかからないはずなので、コードに重大な問題があります。

なぜそんなに時間がかかるのかがわかっていて、 memory_limit = 512M以上に設定できるようにしたい場合は、問題ないはずです。

Umair Idrees picture
2014年03月09日
98

PHPのメモリ割り当ては、永続的または一時的に調整できます。

恒久的に

PHPのメモリ割り当ては2つの方法で永続的に変更できます。

php.iniファイルにアクセスできる場合は、 memory_limit値を希望の値に編集できます。

php.iniファイルにアクセスできない場合(およびWebホストで許可されている場合)、 .htaccessファイルを介してメモリ割り当てを上書きできます。 php_value memory_limit 128M (または必要な割り当て)を追加します。

一時的

PHPファイル内からその場でメモリ割り当てを調整できます。 あなたは単にコードini_set('memory_limit', '128M'); (またはあなたが望む割り当てが何であれ)を持っています。 値を「-1」に設定することで、メモリ制限を削除できます(ただし、マシンまたはインスタンスの制限が適用される場合があります)。

troelskn picture
2009年02月18日
64

PHPスクリプトでメモリリークが発生するのは非常に簡単です。特に、ORMなどの抽象化を使用している場合はそうです。 Xdebugを使用してスクリプトのプロファイルを作成し、そのすべてのメモリがどこに移動したかを調べてみてください。

JamesAD-0 picture
2015年06月28日
57

array_pushを使用して2250万レコードを配列に追加すると、ファイルphp.iniのメモリ制限として4Gを使用すると、約2,000万レコードで「メモリが使い果たされた」致命的なエラーが発生し続けました。 これを修正するために、ステートメントを追加しました

$old = ini_set('memory_limit', '8192M');

ファイルの先頭にあります。 これで、すべてが正常に機能しています。 PHPにメモリリークがあるかどうかはわかりません。 それは私の仕事ではなく、気にもしません。 私は自分の仕事を終わらせる必要があります、そしてこれはうまくいきました。

プログラムは非常に簡単です:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

致命的なエラーは、メモリ制限を引き上げるまで3行目を指し、エラーが解消されました。

Danny Beckett picture
2017年03月13日
46

memory_limitphp.iniに設定されていても、このエラーが発生し続け、値はphpinfo()正しく読み取られました。

これから変更することにより:

memory_limit=4G

これに:

memory_limit=4096M

これにより、PHP7の問題が修正されました。

Kristen Waite picture
2015年05月09日
23

上記のエラーが表示された場合(特に(tried to allocate __ bytes)が低い値の場合)、それは、出口なしで自分自身を呼び出す関数のように、無限ループの指標である可能性があります。

function exhaustYourBytes()
{
    return exhaustYourBytes();
}
Derick Fynn picture
2015年04月22日
20

fastcgi / fpmでmemory_limitを変更することで、これを適切に修正できます。

$vim /etc/php5/fpm/php.ini

128から512のようにメモリを変更します。以下を参照してください

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M
Prem Kumar Maurya picture
2013年12月05日
19

これらの2行を有効にした後、動作を開始しました。

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120