エラー:Fatal error: Allowed memory size of 8388608 bytes exhausted ・・・
2007年02月17日
新しいモジュールをインストールしたら、トップ画面に
Fatal error: Allowed memory size of 8388608 bytes exhausted ・・・
と、表示されエラーした。調べてみたところ、サーバーのメモリーを食い過ぎてエラーするらしい。ひ弱なサーバーほど、エラーするとか・・・^^;
とりあえず php.ini に、memory_limit = 8M を記述してみても駄目だった・・・memory_limit = 16M まで上げてみると、エラーしなくなった。次エラーしたら、24にしてみよ。しかし、ドコまで上げられるんだろ・・・?
PHPでファイルをアップロードしたり、サムネイルを製作するとメモリーを大量に使う。
memory_limit = 8M
-1にすると無制限、初期値は8M
16M,32M,64M,128M,256Mなどが指定できる数値PHPでは実行時にスクリプト実行に必要なメモリーがこの制限値を越えるかどうかを確認する。しかし,この確認を行っている時にあるタイミングでスクリプトのリクエストが中断されると,メモリーがリモートから書き換えられる危険性が生じる可能性がある。メモリーが書き換えられることで任意のコードを実行されたり,サーバーを乗っ取られる危険性も発生する。
この問題の対策は,最新バージョンであるPHP 4.3.8(またはPHP 5.0.0)に更新するか,memory_limitオプションを無効にすることである。ただし後者の対策では,DoS攻撃を受ける危険性が増大することになる。
PHPでファイルをアップロードする場合は、いくつか設定で気をつけておくべき箇所がある。それは以下の4つの設定だ。
file_uploads(PHPでファイルアップロードできるようにするかどうか)
memory_limit(PHPが使用することのできるメモリの上限)
post_max_size(PHPがpostによって受け取ることのできる容量の上限)
upload_max_filesize(PHPが処理できるアップロードファイルの上限)
まずファイルのアップロードがまったくできない場合は1つ目のfile_uploadsが正しく設定されているかどうかチェック。Offとかだともちろんアップロードできない。
次にファイルサイズが大きいとアップできない場合は残りの3つの設定をチェックする。上記の設定はそれぞれ以下の関係を守る必要がある。
memory_limit > post_max_size > upload_max_filesize
しかし、これらを正しく設定してもまだアップロードができない場合がある。それはapacheの設定だ。apacheの設定で以下のようなディレクティブがある。
LimitRequestBody
ここでアップロードで使用できる(純粋にはファイルだけではないが)ファイルの容量の上限が記述されていることがある。もちろんPHPでいくら設定しても、apacheではじかれてしまっては元も子もない。
この設定もチェックしよう。
なおそれぞれのチェックはphp.iniやhttpd.confを見ればだいたいいいのだが、PHPの場合は/etc/php.d/の中のファイル、/etc/httpd/conf.d/の中のファイルなどもチェックしておく必要がある可能性がある(設定ファイルを分散して設置することができるから)。
ファイル名やファイルへのパスは各自の環境に合わせる必要があることは言うまでもない。
難しいね。