2013年6月17日月曜日

IIS6以上CGIでのstderr落ち問題

502 - Web サーバーがゲートウェイまたはプロキシ サーバーとして動作しているときに、無効な応答を受信しました。

検索中のページに問題があるため、ページを表示できません。Web サーバーがゲートウェイまたはプロキシ サーバーとして動作し、上位のコンテンツ サーバーと通信しているときに、コンテンツ サーバーから無効な応答を受信しました。


(2016/8/2 追記) ISAPI 拡張では stdout/stderr を使いませんので、存在しません。GetStdHandle を呼び出しても恐らく NULL が返ってくるだろうので、NULL アクセスで Access Violation になり、エラー落ちするのだと考えられます。
What is an ISAPI Extension? に記述のある EXTENSION_CONTROL_BLOCKReadClient WriteClient を代わりに呼び出すだけです。

さて、エラーは次の条件下で発生するようです:
  • IIS6以上を使っている。
  • phpやperlなどを使っている。CGI/ISAPIに関係なく。
  • stderrに何かを出力する。 

可能性の高い例として、外部プログラムがstderrに出力する場合が挙げられます。

対策例:

exec("pdftk.exe 2>&1", $output, $retval);

コマンドの末尾に"2>&1"をくっ付けて、stderrからstdoutにリダイレクションするか、
"2>NUL"で、Nullデバイスに捨てるのが手っ取り早い対策です。。。

参考:

PHP StdErr after Exec()
http://stackoverflow.com/questions/2320608/php-stderr-after-exec

php5でのexecとstderr
http://dd-kaihatsu-room.blogspot.jp/2013/03/php5execstderr.html

0 件のコメント:

コメントを投稿