web-dev-qa-db-ja.com

PHP memory_limitに達していなくてもメモリ不足エラー

私はたった今、117 MBのメモリが常に不足しているPHPスクリプトを使用してサイトを継承しました。これは、PHPのmemory_limit変数を312 MBに増やしても起こります。 .ini。

これはpcguruからの素晴らしい手がかりのおかげで解決されました。以下の私の答えをご覧ください:私はついに答えを見つけました

ini_get('memory_limit')はphp.iniで設定された値を返すので、値を変更した後にApacheが再起動したことは確かです。 memory_get_usage(true)を使用して、途中のさまざまな時点でスクリプトによって消費されたメモリを返します。そして、117 MBに達すると常に失敗します。

内部にPHP制限がありますが、個々のスクリプトに117MBを超える割り当てが行われたことはありません。

サーバーには1GBのRAMがあり、CentOSを実行しています。ルートシェルアクセスがあります。PHPはバージョン5.3.18です。MySQLはバージョン5.1.66-cllです。 。

このスクリプトはユーザー名/パスワードの背後にあり、公開アクセスを提供することはできません。

追加して編集:

1)これまでにご協力いただきありがとうございます。以下のさまざまな回答の下で、特定のユーザーのコメントへの返信に詳細が記載されています。

2)Suhosinがインストールされていません。スクリプトの実行、定数の確認、php -vの実行など、複数の場所で確認しました

3)Apacheログには、特定のエラーメッセージの記録がありません。ロギングはphp.iniでオンになります。ログ全体を検索するためにgrepをパイプ処理しました。

4)この場合、間違ったエラーが報告されている可能性はありますか?

20
user8109

私はついに答えを見つけました。その手掛かりは、「サーバーのRAMが1 GBしかないため...」で始まるpcguruの答えに由来しています。

気がついたら、Apacheがメモリ制限のPHPの機能に影響を与える可能性があるため、Apacheに独自のメモリ制限があるかどうかを調べました。 httpd.confの一番上で、次のステートメントを見つけました:RLimitMEM 204535125

これはwhm/cpanelによってそこに置かれます。次のWebページによると、whm/cpanelは仮想サーバーでその値を誤って計算します... http://forums.jaguarpc.com/vps-dedicated/17341-Apache-memory-limit-rlimitmem.html =

メモリが不足しているスクリプトはほとんど処理されているため、RLimitMEMを268435456(256 MB)に増やしてスクリプトを再実行しました。アレイのマージを完了し、ダウンロード用のcsvファイルを作成しました。

ETA:RLimitMEMとRLimitCPUについてさらに読んだ後、httpd.confからそれらを削除することにしました。これにより、ini_set( 'memory_limit'、 '### M')が機能するようになり、特定のスクリプトに必要なメモリを追加しました。また、そのサーバーのRAMを2倍にしました。

このやや厄介な問題の検出にご協力いただき、特に、私を解決に導く重要な手がかりを見つけたpcguruに感謝します。

20
user8109

サーバーにはRAMの1 GBしかないので、システムメモリが完全に不足している可能性に傾いています。

このスレッドを参照 。より一般的な「致命的なエラー:許可されたメモリサイズ...」ではなく、同じ「PHPの致命的なエラー:メモリ不足」が発生します。あなたのエラーは、システムがそれ以上メモリを割り当てることができないことを示しています。つまり、PHP:sの内部関数でさえ、あなた自身のコードは言うまでもなく、これ以上メモリを割り当てることができません。

PHPはApacheで実行するように設定されていますか?モジュールまたはCGIとして設定されていますか?PHPプロセスを同時に実行できますか?スワップスペースが利用可能ですか?

PHPをApacheのモジュールとして使用する場合、Apacheには、PHPプロセスが割り当てたメモリを保持するという厄介な習慣があります。 PHPワーカー内のモジュール、単にワーカーを完全に再起動します。PHPは単純にPHPそのワーカーは多くのRAMを割り当てるスクリプトを提供するため、時間の経過とともにメモリが制限されるため、それぞれが100 MB以上を使用する多数のワーカーが同時に存在する場合、RAMがすぐに不足します。 。

8
oldwizard

これはあなたの問題に対する答えではないかもしれませんが、コマンドラインからPHPを実行すると、php.iniからメモリ制限を上書きできます。

php -d memory_limit=321M my_script.php

CLIを介したデフォルトのメモリ制限が正確にわからない。

また、php --iniそして結果を確認します。

2
aebersold

これは、スクリプトが特定のメモリ使用量の後に死んでいる理由に対する答えではありませんが、PHPスクリプト自体内でメモリ制限を完全に削除することで回避できます。

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

これは危険です。暴走したスクリプトがある場合、PHPはサーバーに割り当てられるものがなくなるまでメモリを消費し、転倒します。あなたはsureです。スクリプト自体は問題ではなく、出力をテストするだけです。

If PHPには、スクリプトごとにメモリ使用量の制限があります。いいえ。1GB近くのメモリ使用量でスクリプトを個人的に実行しました。

2
K.A.F.