Authentication




Cancel OK
B!コメントする  2012-11-16 19:52:00 by old

環境の移設やバージョンアップに伴う対処

お仕事で別の環境やバージョンアップしたサーバーでも動作するか確認する必要があり
さっそく試したところものの見事にはまりました。

一つはPHPのエラーレベル。

ヘッダーなんかでページ遷移やトークンのやり取りをしている場面があったのですが、それがうまいこと機能していない。
よくよく見てみてるヘッダーを送信する前にすでに何か出ているのでヘッダーが送れんのんじゃボケというログが残っていた。

元の環境ではエラーは一切表示しないように表示していたため、何も出力されずにヘッダーはそのまま正常に出ていたということだった。

ではなぜエラーが出ていたのかというとPHPのバージョンが上がったことによるエラーだった。
一番大きかったのは「mktime」関数でのエラー。
PHP5.1.0あたりから扱いが変わったらしく、mktimeにセットする値に空がある場合は

Warning: mktime() expects parameter 1 to be long, string given in ~


と表示されるようになっていた。
処理の都合上、空だと値がおかしくなってfalse扱いとなっていたので気づかなかった。
まず、ここを修正してエラーの1つを潰す。

次に

fatal error: call to undefined function getallheaders()


というエラーが表示された。
これは直訳すると「getallheaders関数が無いのに呼ぼうとするなんてバカなの死ぬの?」という内容。

getallheadersが無いわけないだろとアレコレ試してみたものの、どうしても機能しない。
こっちもGoogle先生にいろいろと聞いてみるとどうやら、PHPがApacheのモジュールとしてインストールされている場合のみサポートされている関数だそうで、CGIモードだったり付け足したりした環境だと使えないとのこと。

しかし、この関数使えないと影響範囲が大きいので同じ関数名を今度はBing先生に聞いたら以下のが出てきた。

function getallheaders()
{
global $HTTPSERVERVARS;
if (!empty($HTTPSERVERVARS) && isarray($HTTPSERVERVARS))
{
reset( $HTTP
SERVERVARS );
while( $each
HTTPSERVERVARS = each($HTTPSERVERVARS) )
{
$name = $eachHTTPSERVERVARS['key'];
$value = $each
HTTPSERVERVARS['value'];
if(substr($name, 0, 5) == 'HTTP')
$headers[str
replace(' ', '-', ucwords(strtolower(strreplace('', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}


元の環境では何もなく動いていたけど、やっぱりエラーログを確認しながら作るのも大事だけど、開発中はerror_reporting(-1);で書くのも大事なんだととても実感した。

getallheadersは環境に依存するので仕方ないけど、
もっと最初から綺麗にコーディング出来てれば避けることの出来たものも多いで今後もコーディング時のルールなんかは見直していきたいと思う。


PHP  

  • コメント
  • コメントはまだありません