ここ数日、Joomla 2.5 で動作するようにスクリプトを更新しています。ほぼ完成しましたが、まだ解決できていないことが 1 つあります。そして、それは奇妙なものです。
スクリプトには、アフィリエイト XML を解析する cron があります。これを行うために、以下に示すように PHP 関数 xml_parse を使用します。
if (!($fp = @$file_function($url, 'rb'))) {
$this->error("Cannot open {$url}");
return;
}
while (($data = fread($fp, 8192))) {
if ( defined ('LIBXML_BUG') ) {
# fix voor LIBXML BUG
$data=str_replace("&","XMLLIBHACK",$data);
}
if (!xml_parse($this->parser, $data, feof($fp))) {
printf('XML error in %s at line %d column %d',
$url,
xml_get_current_line_number($this->parser),
xml_get_current_column_number($this->parser));
unset ($this->items);
}
}
xml_parser_free( $this->parser );
前述のように、問題は xml_parse 関数にあります。この行で、ページ/スクリプト全体が動作を停止し、この行の上に書かれた内容のみを返します。error_reporting が E_ALL で display_errors が On の場合、エラーは返されません。意図的にエラーを作成すると、エラーが表示されるため、error_reporting が機能しています。パーサー($this->parser)は別ファイルに作成されます。これが読み込まれます(var_dumped $this->parser)。
$this->parser が作成されるコード (このクラスは MagpieRSS と呼ばれると思います):
function create_parser($out_enc, $in_enc, $detect) {
if ( substr(phpversion(),0,1) == 5) {
$parser = $this->php5_create_parser($in_enc, $detect);
}
else {
$parser = $this->php4_create_parser($in_enc, $detect);
}
if ($out_enc) {
$this->encoding = $out_enc;
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $out_enc);
}
return $parser;
}
/**
* Instantiate an XML parser under PHP5
*
* PHP5 will do a fine job of detecting input encoding
* if passed an empty string as the encoding.
*
* All hail libxml2!
*
*/
function php5_create_parser($in_enc, $detect) {
// by default php5 does a fine job of detecting input encodings
if(!$detect && $in_enc) {
return xml_parser_create($in_enc);
}
else {
return xml_parser_create('');
}
}
/**
* Instaniate an XML parser under PHP4
*
* Unfortunately PHP4's support for character encodings
* and especially XML and character encodings sucks. As
* force to UTF-8 use admin settings to change this
*/
function php4_create_parser($in_enc, $detect) {
if ( $detect ) {
$in_enc = 'UTF-8';
}
return xml_parser_create($in_enc);
}
これを解決するアイデアがありません。$dataをチェックして、さまざまなエンコーディング(ISO、UTF-8など)を試しましたが、すべてがファイルのようです。
XML ファイルの例は、http: //pastebin.com/wT1pVZLQにあります。