5

特定の PHP スクリプトの許容メモリを増やそうとしています。私が何をしても、例えばこれ:

ini_set('memory_limit', '512M');

...スクリプトは常に約 300MB でメモリ不足になります。

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255

memory_limit実際に変更されていることをいくつかの手段で確認しました。問題は、PHP が合計 300 MB のメモリ (25165824 バイト + 343810589 バイト = 352 MB) を物理的に割り当てることができないことです。

次の仕様の 2 つの異なる Windows ベースのコンピューターで、PHP/5.3.0 と PHP/5.3.9 の両方を試しました。

  • Windows XP / Windows Server 2003 (どちらのコンピューターも 1GB または RAM を搭載した 32 ビット ボックスです)
  • 公式の PHP 32 ビット VC9 バイナリ
  • Apache 2.2 モジュールとして実行 (サードパーティの 32 ビット VC9 バイナリ)

物理 RAM の半分を使用するとスワッピングが強制され、動作が非常に遅くなることは理解していますが、ライブ サーバーにデプロイできるようにスクリプトが実際に機能することを確認する必要があります。大きな値 (同じエラーが発生した) と小さな値 (スクリプトが制限に達したか、Apache がクラッシュした) も試しました。

この明らかにハードコーディングされたメモリ制限の原因は何ですか?

更新 #1: Windows Server 2003 ボックス (実際には VMWare 仮想マシン) でさらにテストを行いました。「物理」RAM を 2 GB に増やし、ページング ファイルが 1152 MB まで拡張できることを確認しました。タスク マネージャーは、現在のトランザクションの負荷が 886 MB で、1.5 GB の空き物理メモリがあることを示しています。ただし、まったく同じ数値で同じエラーが発生します。

更新 #2:私が言ったように、memory_limitディレクティブは問題ありません。と の両方に表示されini_get()ますphpinfo()。表示されるエラー メッセージは、私のものとは少し異なります。mine は PHPクラッシュを示します。比較してください:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes)
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes)

問題を再現して報告するためのスクリプトを作成しようと思います。

4

3 に答える 3

4

OOM 例外は、メモリ制限の警告とは異なります。

これは、オペレーティング システム内で使用できるリソースが不足しているため、PHP が実際にメモリを割り当てることができないことを意味します。

これをサポートするのに十分なメモリ/ページングがシステムにあることを確認する必要があります。

于 2012-01-31T11:21:53.120 に答える
0

PHP がmemory_limitと言うとき、実際にはmax_input_timeを意味する場合があります(この場合、-1 は無限です)。

于 2013-05-09T10:10:28.933 に答える