0

ここ数日、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にあります。

4

3 に答える 3

2

SimpleXMLElementはるかに柔軟なものを使用することをお勧めします..必要な要素を取得するためにループするだけです。

XMLの使用例

header('Content-Type: text/html; charset=utf-8');
$sxe = simplexml_load_file("log.xml", "SimpleXMLElement");

echo "<pre>";
foreach ( $sxe->dataHeader as $element ) {
    foreach ( $element as $key => $value )
        echo $key, " = ", $value, PHP_EOL;
}

echo PHP_EOL;
foreach ( $sxe->data as $record ) {
    foreach ( $record as $key => $element ) {
        foreach ( $element as $key => $value )
            echo $key, " = ", $value, PHP_EOL;
    }
}

出力

exportType = stream
exportId = 256106
rows = 1
lastChecked = 2012-11-04 14:03:06.26
lastUpdated = 2012-11-04 00:03:02.822
parserLocale = nl_NL
streamCurrency = EUR
name = befit2day.nl
description = 


recordHash = 1124208770
url = http://clicks.m4n.nl/_c?aid=14375&adid=695437&_df=true&turl=http%3A%2F%2Fbefit2day.nl%2F
title = Universeel krachtstation
description = Géén verzendkosten Verwachte levertijd 5 werkdagen Universeel krachtstation In hoogte verstelbare haltersteunen Rugleuning in 6 standen te verstellen Biceps curl steun in 3 standen te verstellen Been curl in 3 standen te verstellen (te belasten tot 60 kg) Geschikt voor halterschijven met stang opening van 20 - 31 mm Ook te gebruiken voor weighted crunches (met behulp van de kabel), tot 60 kg Ook te gebruiken voor dips Maximaal belastbaar tot 280 kg (inclusief gebruikersgewicht) Bankdrukken tot 180 kg Totaal gewicht 40 kg Geleverd exclusief halterstangen en gewichten Afmetingen krachtstation (L x B x H): 180 cm x 106 cm x 90-110 cm Afmetingen rugleuning (L x B x H): 68 cm x 28 cm x 4 cm Afmetingen curl steun (L x B x H): 28 cm x 44,5 cm x 4 cm Met aan de onderzijde gummi bekleding voor bescherming van de vloer
offerid = 
image = http://befit2day.nl/img/products/11749/103/universeel-krachtstation.jpg
price = 149.90
category = dagaanbieding
subcategory = 
stock = 1
timetoship = 
ean = 
price_shipping = 0.00
price_old = 299.90
vendor = 
category_path = 
publisher = befit2day.nl
column0 = dagaanbieding
time = 0:00
logo = http://befit2day.nl/themes/store_4/images/logo.jpg
merchantID = 20420
于 2012-11-10T02:31:54.047 に答える
1

ログをチェックしてパーサーがスローしているものを確認するか、ini_set('display_errors'、1);を試してください。

おそらく、試したエンコーディングと互換性のない文字がファイルに含まれているか、xmlファイルが適切にフォーマットされていると認識されていません。

エンコーディングの問題である場合は、最初に文字を置き換え(1つまたは2つしかない場合)、それをxmlとして解析するか、xmlファイルを完全にサポートするエンコーディングを見つけます。

于 2012-11-07T16:08:43.857 に答える
1
tail -f /var/log/apache2/error.log

Web サイトを更新して、「セグメンテーション違反」を監視します。これは通常、すべてが魔法のように応答を停止した場合に当てはまります。

于 2012-11-08T15:26:56.663 に答える