4

Windows+Apache での PHP アプリケーションが「メモリ不足 (割り当てられた 422313984) (45792935 バイトを割り当てようとしました)」と表示されて停止しました。

私のマシンには 4GB の物理メモリがありmemory_limit、PHP.ini ファイルで -1 のディレクティブを設定したため、停止した理由がわかりません。Apacheも再起動しました。

422313984+45792935 バイト以上のメモリを割り当てるには 4GB で十分だと思います。

PHP または Apache にメモリを使用する別の設定はありますか?

パフォーマンスカウンターもまとめてみました。最大メモリ使用量はマシン全体で2GBでした。また、httpd プロセスは 1.3GB を使用しました。

コードを表示することはできませんが、実際にはコードは DBMS から 30000 行 (それぞれ 199 バイト) をフェッチsimplexml_load_string()し、ループ内で使用して XML に解析します。

コードのデータが小さいか、30000 から 1000 のようにループ期間が短い場合、コードは通常終了します。

別のケースでは、Apache を起動した後の最初の実行は成功します。

何らかのメモリリークが発生していると思います。

実際にエコーを行ったところPHP_INT_SIZE、PHP は 4 を示しています。おそらく、私の PHP は 32 ビット バージョンです。

Álvaro G. Vicario が次のように指摘するように、メモリ使用量の問題がこのバージョンの PHP にある場合、PHP の 64 ビット バージョンに変更することで解決できますか? また、Windows 用の 64 ビット バージョンの PHP を入手するにはどうすればよいですか? http://windows.php.netで見つかりません

4

1 に答える 1

3

«メモリ不足»メッセージ ( «Allowed memory size尽くされた»メッセージと混同しないでください) は、PHP インタープリタが文字どおりメモリ不足であることを常に示しています。微調整できる PHP や Apache の設定はありません。コンピュータが PHP に RAM を追加することができないだけです。一般的な原因は次のとおりです。

  • メモリを大量に使用するスクリプト。
  • PHP インタプリタのメモリ リークまたはバグ。

SimpleXML は決して軽量な拡張機能ではありません。それどころか、その使いやすさと便利な機能には代償が伴います。リソースの消費量が多くなります。コードを 1 行も見なくても、SimpleXML が 30,000 項目を含む XML ファイルを作成するのにまったく適していないことは確かです。2GB の RAM を使用する PHP スクリプトは、サーバー全体を停止することしかできません。

プロジェクトの途中で基本ライブラリを変更することを好む人はいませんが、最終的にはそうする必要があります。PHP は、 XMLWriterと呼ばれるプル パーサーを提供します。使い方はそれほど難しくなく、次の 2 つの利点があります。

  • SimpleXML が使用する複雑なオブジェクトを作成しないため、リソースの消費量が大幅に削減されます。
  • 部分的な結果をファイルにフラッシュできます。
  • ファイルに直接書き込むこともできます。

これにより、2 GB のスクリプトを数 MB で実行できると確信しています。

于 2013-03-01T12:59:08.180 に答える