PHPのビルドインサーバで発生するapache_request_headers()のバグとそのworkaround

apache_request_headers()のバグ

このバグはPHP :: Bug #67594 :: Unable to access to apache_request_headers() elementsで報告されているものです。

内容としては、PHPをビルドインサーバ(php -S)で動かしている場合、apache_request_headers()を実行して返ってくる配列に要素に、その要素が存在するにもかかわらずアクセスできないというバグです。ただし、その配列をvar_dump()すると内容を見ることはできます。

例えば、var_dump(apache_request_headers())を実行した場合は、

array(8) {
  ["Host"]=>
  string(14) "localhost:8080"
  ["Connection"]=>
  string(10) "keep-alive"
  ...
}

となりますが、同じ環境でvar_dump(apache_request_headers()['Host'])を実行した場合は、

NULL

となってしまします。

対象バージョン

どのバージョンで発生するのかは詳しく調べていませんが、Mac OS X Yosemite(10.10)のPHP 5.5.14やUbuntu 14.04の5.5.9では発生しています。

どうやら、5.6.0からは修正されているみたいです。

Workaround

apache_request_headers()が返す配列の要素に直接アクセスすることはできませんが、foreach経由でならアクセスが出来ました。そのため、次のように新しい配列にforeachを使ってコピーすればこの問題を回避できます。

$requestHeaders = [];
foreach(apache_request_headers() as $key => $value){
  $requestHeaders[$key] = $value;
}

その他

apache経由でなくても使えるのにapache_request_headers()っていう名前、どうかしてる。