PHPをCGI駆動にするとWPの管理画面の一部が変になる
「WP super cache」を動作させるためにphpをcgi駆動にしたのですが、この影響でWP(WordPress)の管理画面で不具合が出るようになってしまいました。表示が変と言うだけで、動作に害はないようなのですが。
coreserverにおいて、.htaccessによりPHPをまるっとCGIで動作するように設定すると管理画面の一部の表示がきちんと出なくなりました。

下書きの自動保存が実行されるとこのようになります。「下書きが 0:00:00 に保存されました。」と出るべきところが白いバックグラウンドを赤い線で囲んだような表示になります。
この部分のソースは以下のようになっています。
<span id="autosave"><div class="error"><p><wp_ajax><response action="autosave_32"><autosave id="32" position="1"><response_data><!--[CDATA[下書きが 2:08:39 pm に保存されました。]]--></response_data></autosave></response></wp_ajax></p></div></span>
これはどうも、レスポンスは返ってきているのにちゃんと処理できていない、ということのようです。
一方で、cgiとモジュールの動作の違いを調べていく中で、以下のような記述を見つけました。
“CGI版ではheader()の指定如何に関わらず常に”Content-Type: text/htmlが出力される”php: header()が正しく機能しない – XREA&CORE SUPPORT BOARD
つまり、自動保存の結果のレスポンスを返す部分で、header関数を使用している部分があり、これがちゃんと機能しないためにエラーとして処理されているのではないか。
そう考えて、cgiで動いているときと、モジュールで動いているときのレスポンスのcontent-typeを比較したところ、cgiの場合は「text/html」、モジュールの場合は「text/xml」でした。これはどうも間違いなさそうです。
そこで、header関数を使用しているところを探して、コードをさかのぼっていきました。その関数のあるファイルを.htaccessでモジュールにすればheaderが機能するようになるのではないかと思ったので。
さかのぼった順に上げていくと、
- /wp-includes/autosave.js
- /wp-admin/admin-ajax.php
- wp-load.php
- /wp-includes/classes.php
- wp-load.php
- /wp-admin/admin-ajax.php
という感じです。そして、この「/wp-includes/classes.php」の中にある「WP_Ajax_Response」クラスが下書き保存結果の表示に利用されており、このクラスの中のsend関数でheader関数が使用されていました。
このたった1行が機能しないためだけに表示に影響が出るとは…
さて、原因となるファイルも分かったところで、じゃあ、モジュールで動かせば…とやってみたのですが、結果はダメでした。呼び出している大元から全てモジュールで動かすようにしないとダメっぽい?
原因は分かったのですが、解決ならず。そのままにしておいてもたぶん、大した問題はないと思うのですが、なんとなく気持ちが悪いので、WP Super Cacheを外して、cgi動作からモジュール動作に戻しました(ただし、async-upload.phpだけはcgi動作)。
原因は分かっているのに、なんとも口惜しい感じです。
