8

他の多くの質問で指摘されているように、php.ini で display_errors を Off にすると、致命的なエラーが発生したときに Web サーバーがステータス コード 200 OK ではなく 500 内部サーバー エラーで応答します。動作を説明するために、未定義の関数を使用して簡単なテストをセットアップしました。

php.ini

display_errors = On

index.php

<?php test();

与えます:

Fatal error: Call to undefined function test()
in D:\xampp\htdocs\index.php on line 1

または、次のように関数呼び出しを黙らせると、空白のページになります。

<?php @test();

どちらの場合も、回答ヘッダーは次のとおりです。

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 20:08:22 GMT
Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.8
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

php.ini を次のように変更します。

display_errors = Off

原因:

HTTP/1.0 500 Internal Server Error
Date: Tue, 10 Jul 2012 20:10:35 GMT
Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.8
Content-Length: 0
Connection: close
Content-Type: text/html

display_errors が Off のときに、Web サーバーが 500 で応答する基盤となるメカニズムを誰か説明してもらえますか?

4

1 に答える 1

8

その理由はdisplay_errors = On、スクリプトにエラーがある場合でも、PHP に適切な HTTP 応答を返すように基本的に要求しているためです。これは、スクリプトと応答の間の追加レイヤーのように考えてください。出力を制御するのはもはやスクリプトではなく、PHP です。

このオプションをオンにすると、「エラーが発生した場合でも、有効な HTTP 応答ページを提供してください (適切なマークアップが含まれている場合もあります) 。ログの代わりにそれを見ることになるからです。 "

に設定するOffと、HTTP 応答は無意味になり、したがって 500 になります。オンにすると、PHP エラーが予想されるため、スクリプトが失敗したとしても、全体としての要求は 500 ではありません。

于 2012-07-10T20:22:00.773 に答える