エラーが発生した時にメールで通知する方法
エラー処理は頭が痛い……。
エラーに気付かないと直しようがありませんので、想定外のエラーが発生しやすい場所は、メールで通知する等して注意を喚起する必要があります。
はい。まぁぼちぼちでいいかと思っていたのですが、先送りできない状況なので、今やります(;_;)
参考までに、現状をまず紹介
今書いているサイトでエラーが出る場合、大抵はXMLのパースエラーです。
複雑なことをやってないので、バグというよりはおかしなデータが入ることで生じるエラーなんですね。
「エラー時には FALSE を返します」とあるのに、親切にもsimplexml_load_stringは、Warningを吐いてくれるわけです。
こんなかんじ。
<br /> <b>Warning</b>: simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: Entity: line 2: parser error : Extra content at the end of the document in <b>/home/******/config.php</b> on line <b>158</b><br /> <br /> <b>Warning</b>: simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: <b>Warning</b>: simplexml_load_string() [<a href='function.simplexml-load-strin in <b>/home/******/config.php</b> on line <b>158</b><br /> <br /> <b>Warning</b>: simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: ^ in <b>/home/******/config.php</b> on line <b>158</b><br /> <?xml version="1.0" encoding="UTF-8"?>
<?xmlで始まらない場合には、エラーとしてその後の処理を中断し、simplexml-load-string以降の処理内容(i_file_get_contentsで取得)をメールで送信しようと思います。
メールで通知する場合はmb_send_mail
mail関数もありますが、エンコードしてくれないので日本語はそのままでは使えません。
▽PHP: mail - Manual
http://www.php.net/manual/ja/function.mail.php
そこでmb_send_mailという関数があります。
こちらはヘッダと本文を「mb_language()の設定に基づき変換、エンコード」するmail()のラッパー関数だそうです。
今回はこれを使います。
mb_send_mail ( string $to , string $subject , string $message [, string $additional_headers= NULL [, string $additional_parameter= NULL ]] )
▽PHP: mb_send_mail - Manual
http://jp2.php.net/mb_send_mail
マニュアルにはヘッダと書いてあるけど、ヘッダのうち日本語の使用が予定されている?subjectだけがエンコードの対象みたい。
toはエンコードされていないとマニュアルに明示されていますが、additional_headersで指定した箇所もみたいですね。
▽PHPで日本語メールを送る - 基本編(EC Studio 技術ブログ)
http://techblog.ecstudio.jp/tech-tips/mail-japanese-basics.html
で、直した結果
<?php // 以上略 $sourcedata = i_file_get_contents ("http://****.jp/auth/{$dcmaker11}/index.php"); if (preg_match('|^<\?xml|s', $sourcedata, $matches)) { file_put_contents(SYSTEM_DIR . "public_html/feed/{$dcmaker11}/index.xml" , $sourcedata); } else{ mb_send_mail ($error_mailto, $errorxml_subject, $sourcedata) } // 以下略 ?>
xmlで始まっている整形式っぽいデータの場合には、file_put_contentsで書き出し、
そうでない場合にはデータを登録アドレス宛にメールする
という形です。
パーサーエラーが冒頭に入っている場合には書き出されなくなるので、表にはでなくなるかな?