22

PHPスクリプトを実行するとエラーが発生します....

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes)

この行を PHP スクリプトに追加しました。

ini_set("memory_limit","3000M");

このステートメントはメモリ使用量を正しく制御しているように見えますが、約 1.8GB を超えることはできないようです。メモリの上限が別の場所で制限されているかのようです。php.iniにも追加しました...

memory_limit = 3000M

メモリが他の場所で制限されているかどうかは誰にもわかりませんか?

Xamppでローカルサーバーを実行しています。Windows 7、64 ビット、4 GB RAM を使用しています。私のスクリプトは PHP の GD 画像ライブラリを使用しており、ImageCreateTrueColor() で画像参照を割り当てようとするとエラーが発生します。

(これが膨大な量のメモリであることはわかっていますが、これは 1 回限りのスクリプトであり、この方法で実行する方がはるかに簡単です。)

ありがとう。

アップデート....

@elusive @Orbling誰もがこの質問に飽きていると思いますが、問題を説明する単純化されたコードを次に示します。

<?php
    ini_set("memory_limit","4000000000");
    echo "ini_get = " . ini_get('memory_limit') . "<br>\n";
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>\n";
    $bigImageHandle = imagecreatetruecolor(22200, 24800);  //this is line 5
?>

ブラウザ出力...

ini_get = 4000000000
memory_get_usage = 524288

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in
E:\User\My_Webs\experiments\houseshunting\temp\osMaps\t1.php on line 5

これを小さなタイル セットと imagecreatetruecolor() で使用されるメモリでテストしたところ、2.7GB 必要であると見積もっています。

4

10 に答える 10

9

64 ビットのオペレーティング システムを実行していますが、Apache と PHP はまだ 32 ビットである可能性があります。mod_php を使用している場合、apache がここでの制限要因になります。

/3GB スイッチを使用し、ソフトウェアが 3GB のサポートを認識していない限り、32 ビット プロセスは約 2GiB の RAM に制限されます。

まだ未使用のように見える約 200 MiB が残っていますが、メモリにロードする必要があるさまざまなライブラリで使用できるほど十分小さいです。

私の知る限り、ライブラリの使用量はコミットされたメモリには表示されませんが、それでも 2GiB の制限にカウントされます (デバイス メモリが 32 ビット ウィンドウの 4GiB の制限にカウントされるのと同じように)。2 GiB グラフィックス カードをインストールすると、使用可能な RAM の 2GiB 未満まで)。

最も可能性の高い解決策は?64 ビット PHP をインストールし、そこにディスパッチします (おそらく system() 呼び出しを使用します)。

于 2013-04-20T10:17:34.437 に答える
1

Apacheの設定を確認してください(例:httpd.conf)。子プロセスが要求を処理できるようにするメモリを制限するRLimitMEMディレクティブが存在する可能性があります。

したがって、PHPの制限を必要なだけ設定できます。Apacheがメモリ制限を使用してプロセスを生成する場合、それを超えることはできません。

ホストされたサービスを使用していて共有サーバーを使用している場合は、この構成にアクセスできない可能性があり、プロバイダーと連携する必要があります。ご覧のとおり、これはサーバー全体に適用される構成です...これを変更するように依頼することはほとんどありません。繰り返しになりますが、1.5Gigプロセスよりも大きなプロセスを生成する場合は、別の方法で問題を解決するか(他の人がこれを提案しています)、ある種の専用サーバー(EC2など)を取得する必要があります。

例えば:

/usr/local/apache/conf
#RLimitMEM 85643200 104857600   # Limit to: 80Mb / process, 100Mb total
RLimitMEM 134217728 537395200   # Limit to: 128Mb / Process, 512Mb total
于 2013-01-29T00:54:42.053 に答える
1

どのPHPバージョンを使用していますか?

memory_limit 変数は 32 ビット整数に含まれている、または含まれていたため、2GB を超えることはできません。

参照: http://bugs.php.net/bug.php?id=39132&edit=1

そのバグレポートの一番下のコメントから、人間が読める形式を数値に変換するルーチンである可能性があります。数字に置き換えてみてください。

于 2010-12-09T14:17:39.673 に答える
-1

これを試して

set_time_limit(300);
ini_set('memory_limit', '20000M');
于 2010-12-09T14:17:45.103 に答える
-2

これを試して:

#php_value memory_limit 300M 
#php_value upload_max_filesize 200M 
#php_value post_max_size 200M 
#php_value max_execution_time 80000 
#php_value max_input_time 80000   
于 2010-12-09T14:21:44.793 に答える