はじめに
さくらのレンタルサーバー上で動いているWordPressの保守作業時にエラーを多発させてその対処をしていたのですが、その中で割と癖が強いと感じる要素があったのでメモとして残そうと思います。
デフォルトのPHP用のメモリ上限が貧弱
ある処理をさせたときに
「このサイトで重大なエラーが発生しました。対応手順については、サイト管理者のメール受信ボックスを確認してください。」
と表示され、より詳細を確認するためにwp-config.php内で
define('WP_DEBUG', true);
と設定したところFatal error: Allowed memory size of 134217728 bytes exhaustedと表示されました。
つまりデフォルトではPHP用のメモリの上限は128MBということで、プラグインの組み合わせや処理の中身によっては足りません。
php.iniの挙動の癖がかなり強い
というわけでメモリの上限の設定を変更するわけですが、方法としてはwww内にphp.iniを作成し
memory_limit = 512M
と記載すればOKです。
そのphp.iniはコントロールパネル上に「スクリプト設定」->「php.ini設定」という項目があるのでそこから作成できます。
が、そこでphp.iniを作成して上記のメモリ上限の設定のみを記述するとWPのテーマによってはログインすらできないほどに壊れます。
その際に表示されるメッセージが以下のようなものです。
Warning: Cannot modify header information -
headers already sent by (output started at (中略)functions.php:***)
in /home/(中略)/pluggable.php on line ***
functions.php内に余計な空白を入れたときなどによく出るエラーですが特に何も編集はしていないので疑わしいものはphp.iniしかありません。
そこで「もともと存在しなかったのだからphp.iniを削除しよう」としてもなんと元に戻りません。
解決方法
php.ini内に
output_buffering = On
の記述を追加する。
意味合いとしては「Warningを画面に出さない」ということです。あくまでErrorではなくWarningなので出力さえしなければ普通に動きます。WPのテーマによってはそれを前提に動いているようです(それはそれでどうかと思いますが)。
逆に何故今まで動いていたのか
web.iniが無い場合、デフォルトではoutput_buffering = Onになっている?
何故web.iniを作っただけで動かなくなったのか
web.iniをコンパネで作成した場合、書いていない情報はデフォルトを反映ではなく場合によってはOFFとして扱われる?
何故web.iniを削除しても直らなかったのか
web.iniをコンパネで作成した場合、削除したとしてもデフォルトの設定を反映ではなくwww内しか参照しないようになる?
おわりに
なんとか対処はできましたが正直納得できていない挙動が多いです。十分なパターンを試したわけではないので憶測の域を出ないところもおそらく多いです。同様のトラブルが発生した際に参考にしていただければと思います。