

現在PHPのアプリを作成しています  
ほぼ完成し、リリースに向けて調整中なのですが  
PHPで発生したスクリプトエラーをIISのInternal Server Errorとして引き渡すことは出来ないでしょうか

[code]

    <?php
        aa
    try{
    ....
    }catch(Exception $ex){
    ....
    }
    
    ?>
    
[/code]

としたときに、画面上に

[code]

    Parse error: syntax error, unexpected 'try' (T_TRY) in C:\inetpub\wwwroot\AAAAA\BBBBB.php on line 3
    
[/code]

と表示されます(例として極端すぎるかもしれませんが)

これを、この様なPHPのエラーでは無く  
IISで表示する一般的なエラー画面を表示したいと思っています

PHPのログは

[code]

    [25-Aug-2015 11:51:25 Asia/Tokyo] PHP Parse error:  syntax error, unexpected 'try' (T_TRY) in C:\inetpub\wwwroot\AAAAA\BBBB.php on line 3
    
[/code]

IISのログは

[code]

    2015-08-25 02:48:43 POST /AAAAA/BBBBB.php - - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:40.0)+Gecko/20100101+Firefox/40.0 http://localhost/AAAAA/ 200 0 343
    
[/code]

となっており、どうもIIS側は正常終了になってしまっているようです

出来ればIISにもエラーとして通知したいのですがphp.iniの設定などはどこをいじればいいのでしょう


CC BY-SA 3.0
2015-08-25T03:11:58.383
14818
2015-08-28T09:04:07.210
10098
question
php iis
PHPで発生したエラーをInternal Server Errorとして、IISに渡したい


Internal Server Error は HTTP コード500番台ですので  
PHPのなかで500系のレスポンスを返せば良い気がします。

[code]

    header('HTTP/1.1 500 Internal Server Error');
    
[/code]


CC BY-SA 3.0
2015-08-26T18:52:22.397
14884
2015-08-26T18:52:22.397
5008
14818
answer


もしHTTP`200`をHTTP`500`に替えたかったら、[`display_errors`](http://php.net/manual/ja/errorfunc.configuration.php#ini.display-
errors)が`Off`または`0`にしよう。

`display_errors=On`または`display_errors=1`であれば、たとえ[`E_PARSE`](http://php.net/manual/ja/errorfunc.constants.php#errorfunc.constants.errorlevels.e-parse)や`E_ERROR`
でも、PHPエンジンはHTTP`200`を出力する。

* * *

もしIISのログにPHPのエラーが見えるようになりたかったら、`error_log`を使おう。例えば`php.ini`こうすると：

[code]

    error_log=syslog
    log_errors=1
    error_reporting=-1;全部
    log_errors_max_len=0;『無限』
    
[/code]

エラーがシステムロガー（[`syslog`](http://php.net/manual/ja/function.syslog.php)と同じ目的地）に渡す:

[![画像の説明をここに入力](https://i.stack.imgur.com/0mIvn.png)](https://i.stack.imgur.com/0mIvn.png)

[参考](http://php.net/manual/ja/errorfunc.configuration.php#ini.error-
log)によると、`error_log`設定しなければ、ログは自動的にIISのとこへ行く:

> このディレクティブが設定されていない場合、エラーは SAPI エラーロガーに送信されます。これは、例えば Apache のエラーログ、 あるいは CLI
> なら stderr になります。

そう書いてあるけど、なんだかどうしてもダメになるしかない。（エラーメッセージがIISのログに表示されず、ブラウザで見える。多分[web.config](https://technet.microsoft.com/ja-
jp/library/cc772009\(v=ws.10\).aspx)どこか間違ったんのせいだ（[英語のリンク](https://stackoverflow.com/q/1808680/632951)）。）

「`error_log`設定しない場合」について指示実行しなかったら、直接に設定すればいい。まずサイトログの場所を見つけ:

[![画像の説明をここに入力](https://i.stack.imgur.com/Yy5mO.png)](https://i.stack.imgur.com/Yy5mO.png)

、`php.ini`を設定する。例:

[code]

    error_log="C:\inetpub\logs\LogFiles\W3SVC1\u_in150828.log"
    
[/code]

（注意、一つのサーバーには複数のサイトを持つことでもある 。各サイトには独自のログがある。）

次、`iisreset`で再起動する、または:

[code]

    net stop w3svc
    net start w3svc
    
[/code]

最後に **書き込みと読み込み** の許可、選択したユーザーに与える:

[![画像の説明をここに入力](https://i.stack.imgur.com/O5y1X.png)](https://i.stack.imgur.com/O5y1X.png)

そのユーザーはほとんど`IIS_IUSRS`です。（`IUSR`って主張する意見を聞いたことがあるけど、それでしてみた結果は成し遂げられない。でもそちらの場合が成し遂げられるかもしれない。）「[認証](https://technet.microsoft.com/ja-
jp/library/cc772009\(v=ws.10\).aspx)」使えば、認証されたユーザー（[英語のリンク](https://stackoverflow.com/q/17765116/632951)）です。


CC BY-SA 3.0
2015-08-27T21:44:39.130
14921
2015-08-28T09:04:07.210
2017-05-23T12:38:56.467
-1
4022
14818
answer


Syntaxエラーでも対応できる方法というのは知らないですが、PHPに用意された機能を組み合わせるとある程度のエラーハンドリングはできるようになります。  
要素としては、  
`header()`  
`register_shutdown_function()`  
`error_get_last()`  
`ob_start()`  
と言ったものを使います。  
つまり、スクリプトが終了したときになぜ自分が止まったのかerror_get_last()で調べて、正常終了でなければheader()でエラーステータスを設定するようにします。その際、header()はそれまでにデータが送信されていてはいけないという制約があるので、最初にob_start()でバッファリングしてメッセージの送信は保留させます。  
かなり大掛かりな機構になるので、最終調整でちょちょっと入れるというわけにはいかないですが。私はJSONでデータを送るクラスにこれを仕込んでいました。主にデバッグするのにエラーログを見るのが面倒だから、ですが。


CC BY-SA 3.0
2015-08-28T02:05:57.637
14926
2015-08-28T02:05:57.637
8136
14818
answer