web-dev-qa-db-ja.com

PHP / Apacheのメモリ上限

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が必要と推定します

20
spiderplant0

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

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

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

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

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

9
Reece45

Acquia Dev Desktopを使用して、多くのメモリ制限がクラッシュしました。

PHP.iniへのメモリ制限を増やした後。

php_value memory_limit                  1024M
php_value max_execution_time            3000

この問題はそれほど頻繁ではありませんが、まだ発生しています(特にFeature Recreateの場合)

私のhttpd.confに、StackThreadを16Mに増やしました

ThreadStackSize 16*1024*1024

そして、それはメモリクラッシュの問題を解決しました。それが役に立てば幸い

8
thenrion

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

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

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

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

1
Orbling

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
1
JTigger

この問題は、32ビットのApacheとphpを実行していることが原因である可能性があります。これらを64ビットバイナリにアップグレードして、問題が解決するかどうかを確認してください。

1
Glitch Desire

これを試して

set_time_limit(300);
ini_set('memory_limit', '20000M');
0
Vahan Margaryan