読者です 読者をやめる 読者になる 読者になる

localdisk

PHP とか Java とか Web とか好きなことを書きます。

PHPでサービスをリリースする際の5つのの注意点(エラー処理)

2009/5/28 2:00くらいからOpenpear :: Open PEAR Repository Channelが落ちています。

Warning: require_once(PEAR/Server2.php) [function.require-once]: failed to open stream: No such file or directory in …(ファイル名は省略)

Openpear :: Open PEAR Repository Channel

…しょんぼりしてしまいました。Openpear :: Open PEAR Repository Channelは素晴らしいサービスですし、僕もServices_Backlogをリリースした際お世話になりました。猿も木から落ちるというか弘法も筆の誤りというかこういったこともあるんですね。
なので自戒も兼ねてPHPでサービスをリリースする際の5つの注意点を挙げたいと思います。

追記

現在Openpear :: Open PEAR Repository Channelは復帰しています。

といっても全然大げさな理由がある訳でもなくて、単純にホスティングしているサーバーが頻繁に不安定になる...というだけなのです。

もちろん、エラーハンドリングなどはフレームワークを使って表に出ないようなコードにはなっているんですが、そこのコードに行く前に死んじゃってるのかなあとか想像してるんですが、実際にどういう状態になっているのかまで把握できてません。

An Error Occurred: Not Found

というわけみたいです。エラーハンドリングしてもサーバが不安定だとこういったことが起きるみたいです。

1.display_errorsはOff

これは色んなサイトで見かけますね。エラーの内容は画面に出力しないようにしましょう。上記にあるopenpearの場合Onになっていると思われます。Offにする方法はphp.iniを修正するかPHPスクリプト上でini_setしてあげましょう。

<?php
ini_set('display_errors', 'Off');

2.set_exception_handlerを活用しよう

set_exception_handlerはtry/catchされなかった場合のデフォルトの例外ハンドラを設定します。こいつを設定しておけばcatch漏れした例外もここで補足することが出来ます。最後の砦ですね。大人数で開発するようなプロジェクトでは有効に機能すると思われます。

3.set_error_handlerを活用しよう

set_exception_handlerは例外を扱うだけあってPHP5の関数です。なのでPHP4では使えませんし、そもそもエラーは拾ってくれません。そこでset_error_handlerの出番です。使い方はset_exception_handlerと同じでコールバックする関数を指定するだけです。

4.register_shutdown_functionを活用する

ここからは小技です(笑)。register_shutdown_functionはスクリプト完了した時点で呼び出される関数を登録できます。使い道は色々ですが、処理完了のログを取るのに使ったりとかします。エラー処理と絡めてつかうとこんな感じでしょうか。

<?php
register_shutdown_function('shutdown');
function shutdown() {
    if (!is_null($e = error_get_last())) {
        // エラー処理
    }
}

5.開発時はerror_reporting(E_STRICT)してみる

無理矢理感のただよう5つ目です。…3つの方法にしとけばよかったかな。えーと、制作時にはerror_reporting(E_STRICT)しておくのを個人的には薦めてます。こうしておくと $hoge =& new Hoge()とかクラスのインスタンス変数にvarとかつけてると怒られたりします。大人数の場合コーディング規約を定めたりしますが、あんまり上手くいったためしがないのでこういう手法を採用するのも1つの手だと思います。PHP6からはE_ALLでよいと思います。E_ALLの中にはE_STRICTが含まれますので。

追記

shin1x1さんからのコメントもありますように $hoge =& new Hoge ではE_STRICTは怒ってくれないみたいです。僕の記憶違いでした。誠にもうしわけありません。
E_STRICTのエラーメッセージはPHP E_STRICTで表示されるエラーメッセージを調べてみた - Shin x blogを参考にして下さい。

まとめ

PHPは数ある言語の中でも体系的な知識を得ることが難しい言語だと思っています。デザイナが片手間で使う言語と思われているのか、出版されている書籍は多いものの内容は「逆引き系」ばかりでEffective PHPとかPHP CookbookとかPHP ベストプラクティスとかいう本もありません。
つまり体系的な知識を得ることに適したメディアである書籍にPHPは良書がないわけです。
ないものは仕方ないのでこうやってブログで知識を共有していきたいですね。