23

常に 117 MB のメモリが不足している PHP スクリプトを含むサイトを継承しました。これは、php.ini を使用して PHP の memory_limit 変数を 312 MB に増やした場合でも発生します。

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

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

個々のスクリプトに 117MB を超えて割り当てることのない、私が気付いていない内部 PHP 制限はありますか?

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

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

追加するために編集:

1) 今日までお世話になりました。詳細については、以下のさまざまな回答の下にある特定のユーザー コメントに対する私の返信をご覧ください。

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

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

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

4

5 に答える 5

21

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

ちょっと待って、Apacheに独自のメモリ制限があるかどうかを調べました。これは、PHPのメモリ割り当て機能に影響を与える可能性が高いためです。httpd.confの上部に、次のステートメントがあります:RLimitMEM 204535125

これはwhm/cpanelによってそこに置かれます。次のウェブページによると、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に感謝します。

于 2012-12-20T07:53:04.993 に答える
9

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

このスレッドを参照してください。より一般的な「Fatal error: Allowed memory size of ...」ではなく、同じ「PHP Fatal error: Out of memory」が表示されます。あなたのエラーは、システムがそれ以上のメモリをまったく割り当てられないことを示しています。つまり、PHP:s 内部関数でさえ、独自のコードは言うまでもなく、それ以上のメモリを割り当てることはできません。

PHP は Apache で実行するようにどのように構成されていますか? モジュールとして、または CGI として?同時にいくつの PHP プロセスを実行できますか? 利用可能なスワップ領域はありますか?

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

于 2012-12-19T20:58:51.563 に答える
3

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

php -d memory_limit=321M my_script.php

cli を介したデフォルトのメモリ制限が正確にはわかりません。

また、実行php --iniして結果を確認することもできます。

于 2012-12-19T15:52:45.160 に答える
2

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

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

これは危険です。 ランナウェイ スクリプトがある場合、PHP はサーバーが割り当てられるメモリがなくなるまでメモリを消費します。したがって、これは、スクリプト自体に問題がなく、出力をテストする場合にのみ使用しください。

PHPがメモリ使用量にスクリプトごとの制限を持っているかどうかについては、いいえ。私は個人的に、1 GB 近くのメモリ使用量でスクリプトを実行しました。

于 2012-12-19T16:31:23.257 に答える
-5

コードのどこかに無限ループがあります。

于 2012-12-19T16:09:39.470 に答える