エラーが発生した時にメールで通知する方法

エラー処理は頭が痛い……。
エラーに気付かないと直しようがありませんので、想定外のエラーが発生しやすい場所は、メールで通知する等して注意を喚起する必要があります。


はい。まぁぼちぼちでいいかと思っていたのですが、先送りできない状況なので、今やります(;_;)

参考までに、現状をまず紹介

今書いているサイトでエラーが出る場合、大抵は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>]: 
&lt;b&gt;Warning&lt;/b&gt;:  simplexml_load_string() 
[&lt;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で書き出し、
そうでない場合にはデータを登録アドレス宛にメールする
という形です。


パーサーエラーが冒頭に入っている場合には書き出されなくなるので、表にはでなくなるかな?