ときどき整理します。
cronで各種スクリプトを自動実行していると、warningやエラーがメールで飛んできます。
大抵は参照先のURLが無効(デッドリンク)になっていたり、サイト自体が消えていたり。
自前のコード内で発生するそういう簡単な問題はすぐに対策終了するのですが、外部ライブラリで発生するWarningが消えず困りました。
PHP Warning: DOMDocument::loadXML(): XML declaration allowed only at the start of the document in Entity, line: 2 in /usr/share/php/XML/Feed/Parser/Factory.php on line 49
自前スクリプトでは上記を呼び出しているのは、ループ内です。
ループが複数ある場合、といっても数か所であれば、echoデバッグでループ変数でも出力すればいいんですよね。
面倒な場合、以下のように細工してWarningをエラー停止させると・・
php - Stop script execution upon notice-warning - Stack Overflow
function errHandle($errNo, $errStr, $errFile, $errLine) {
$msg = "$errStr in $errFile on line $errLine";
if ($errNo == E_NOTICE || $errNo == E_WARNING) {
throw new ErrorException($msg, $errNo);
} else {
echo $msg;
}
}set_error_handler('errHandle');
以下のような感じで止まってくれます。
PHP Fatal error: Uncaught exception 'ErrorException' with message 'DOMDocument::loadXML(): XML declaration allowed only at the start of the document in Entity, line: 2 in /usr/share/php/XML/Feed/Parser/Factory.php on line 49' in /home/syasuda/scripts/blog/get2.php:12
Stack trace:
#0 [internal function]: errHandle(2, 'DOMDocument::lo...', '/usr/share/php/...', 49, Array)
#1 /usr/share/php/XML/Feed/Parser/Factory.php(49): DOMDocument->loadXML('??<?xml version...', 0)
#2 /usr/share/php/XML/Feed/Parser.php(113): XML_Feed_Parser_Factory->build(Object(DOMDocument), '??<?xml version...', false, false, false)
#3 /usr/share/php/XML/Feed/Parser.php(93): XML_Feed_Parser->initialize('??<?xml version...', false, false, false)
#4 /home/syasuda/scripts/blog/get2.php(122): XML_Feed_Parser->__construct('??<?xml version...')
#5 {main}
thrown in /home/syasuda/scripts/blog/get2.php on line 12
で、見つかった”問題のある”XMLは以下のような書き出しでした。
^M
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
先頭に^M・・・
というか、xdebugじゃないphpのデバッガってないんでしたっけ?
5.6なら入ってるんですね。5.4以降で使えると。
手元環境は・・・
$ php --version
PHP 5.3.10-1ubuntu3.18 with Suhosin-Patch (cli) (built: Apr 17 2015 15:04:29)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
コメント