悩ましいPHP 500 Internal Server Error

日付 2016.02.03
タイトル 悩ましいPHP 500 Internal Server Error
本文
CSVダウンロードを行うスクリプトがIEでは動作するのにFireFoxとChromeで動作しない。
FireFoxのLive HTTP headersで戻りを確認してみると500エラーが発生している模様。
しかし開発環境では全てのブラウザで動いている。データが問題なのかと思ったが、これもどうやら違うらしい。

結局、

1.
Fatal errorが発生して、

2.
display_errorsがoffになっている。

と500になるが、display_errorsがonだと200で戻されるらしい。

おまけに、header("Content-disposition: attachment; filename=ファイル名"); を指定した場合、IEは500であってもファイルとして受け取るが、FireFoxとChromeは受け取らない。
悪いことにfatalの発生源である行そのものを@で抑制していたためエラーの発生がCSVファイル中に記載されてこないので、エラーが起こっていること自体に気がつけない。

うーん、おかしな状況に早く気がつくには@の利用を控えたほうがよいのだろうが、使わないと事前にエラー検証が難しいのにその関数を利用せざるを得ない場合にエラーメッセージが表示されてしまう状況に対処できないというのも困る。開発と本番で挙動が違うというのも困るし。

display_errorsは常にoffにして、エラーハンドラの側ですべていったん受け取ってからExceptionとしてthrowしなおす、それを表示するかどうかを開発環境かどうかで切り替える、というふうにしたほうがよいのだろうか。

Internal Server Error、色々悩ましいぞ。