WordPress や Movable Type のようなCMS、Web予約やイベントWeb申込等のWebシステムを運用していると、突然まっ白な画面になって、びっくりした経験はないでしょうか。
まっ白な画面になる原因はいくつもありますが、今回はエラーメッセージが「Fatal error: Allowed memory size of …」と表示されていたので、取り扱いデータがメモリの制限値をオーバーしたのだなと分かりました。そこで、応急処置としてメモリ制限値を変更(増量)すれば解決するものと思っていたのですが、エラーが解消されなかったのです。
今回は、なぜエラーが解決できなかったのか、その顛末をご紹介致します。
エンジニア経験のない方には、今回の記事は少し難しいかもしれませんが、自分の運用しているブログやホームページが突然まっ白になっても、落ち着いて行動できるように、一読いただければと思います。
なぜ memory_limit 値を増量しても効かなかったのか
このエラーはシステムの処理を行うときに大量のデータを扱ったため、メモリの制限値を超えたことを示しています。
そこで、とりあえずメモリの制限値を大きくして、急場をしのごうと考え制限値を調べたところ 128MBでした。htaccess に“php_value memory_limit 256M”と記述し、メモリ制限値を倍に引き上げたのです。制限値を倍にしても、サーバー自体のメモリスペックは2GBなので、問題ありませんでした。
そして真っ白になった画面のページを再起動してみたのですが、症状は変わらず、またもまっ白な画面が表示されるだけでした。
phpinfo(); で設定値を確かめたのですが、確かに“256M”になっていました。
なぜ、なぜ(?_?)
ふと思いついて、PHPソースを“memory_limit”で全ファイル検索したところ、ビンゴでした。まっ白になった画面ページのPHPソースに、メモリ制限の設定が“128M”で設定されていたのです。
php.iniディレクティブの設定値の変更方法
php.iniの設定(php.ini ディレクティブ)は大まかには次の3つの方法で設定を変更できます。
- php.ini ファイルを直接修正する
- htaccessに記述する
- PHPソースに記述する
(※ この他にも Windowsレジストリやhttpd.conf、user.ini などでも変更できますが、ここでは割愛させていただきます)
WordPressなどでブログを運用している方は、「2. htaccess に記述する」の方法でphp.iniの設定を変更する場合が多いと思います。管理機能のしっかりしたレンタルサーバーであれば、この方法を推奨しているサーバー業者さんをよく見かけるのではないでしょうか。
しかし、今回発症したシステムは、Wordpress等のCMSではなく、オーダーメイドのイベントWeb参加申込システムだったのです。どこかのシステム開発の業者さんが作ったシステムで、まっ白になった画面は、登録データをCSVデータに変換してダウンロードする機能でした。登録データを全て抽出するので、確かに他の機能に比べれば、メモリを占領する割合は多くなるのは想像できます。また、2~3年前にこのシステムが動くサーバーを移転していると聞いたので、以前動いていたサーバーでは、php.ini のメモリ制限値が低く、その対応のために、メモリ制限値を大きくする必要があり、かといって「2. htaccess」で対応すると、システム全体のメモリ制限値を上げてしまうことになるので、「3. PHPソースに記述する」方法で対応したのでしょう。
また、設定の優先順位は、
「3. PHPソースに記述する」 > 「2. htaccess に記述する」> 「1. php.ini ファイルを直接修正する」
となるので、「3. PHPソースに記述する」をしていると、同様の設定をいくらhtaccess に記述しても効かないわけです。
phpinfo(); で設定値を確かめたら変更後の値に変わっていたのは、phpinfo();の情報は、「2. htaccess に記述する」、「1. php.ini ファイルを直接修正する」の設定値しか反映されず、「3. PHPソースに記述する」の設定値は参照できないのです。
終わりに
Web系に限らず、多くのシステム(プログラム)は作った人の数だけ作り方が違います。ある程度の統一基準や慣習的なものはありますが、制作者の癖やその時の事情などで、ロジックや構造が特殊になることは頻繁です。
これは、オーダーメイドのシステム(プログラム)に限らず、Wordpress や Movable Type 等のCMSでも同様です。CMS本体は1つでも、テンプレートは数えきれないほど存在します。そして、テンプレートごとにシステムのロジックや構造が違います。何かトラブルが発生したり、カスタマイズしたいと思いネットで検索して書かれている通りに対応しても望むとおりにならないことがよくあります。
このようなことを解決するには、やはり知識と経験を積み重ねていく以外に方法はないのだなと毎回気付かされます。