16

編集できないサードパーティの PHP ライブラリを扱っていますが、ほぼ 1 年間正常に動作しています。simplexml_load_stringリモートサーバーからの応答で使用します。最近、大きな反応で窒息しています。これは不動産リストのデータ フィードで、形式は次のようになります。

<?xml version="1.0"?>
<RETS ReplyCode="0" ReplyText="Operation Successful Reference ID: 9bac803e-b507-49b7-ac7c-d8e8e3f3aa89">
<COUNT Records="9506" />
<DELIMITER value="09" />
<COLUMNS>   sysid   1   2   3   4   5   6   </COLUMNS>
<DATA>  252370080   Residential 0.160   No  ADDR0   06051</DATA>
<DATA>  252370081   Residential 0.440   Yes ADDR0   06043</DATA>
<DATA>  252370082   Residential 1.010   No  ADDR0   06023</DATA>
<DATA>More tab delimited text</DATA>
<!-- snip 9000+ lines -->
</RETS>

応答のサンプル ファイル (約 22 MB) をダウンロードしました。どちらのサーバーも PHP バージョン 5.3.8 を実行していますが、結果が異なることに注意してください。私は、両方のファイルが同じであることを確信しています (異なるファイルサイズ、strlen、および最後の 50 文字は、追加のキャリッジ リターン文字を持つ Windows の改行によって説明できると思います)。テスト スクリプト:

error_reporting(-1);
ini_set('display_errors', 1);
$file = 'error-example.xml';
$xml = file_get_contents($file);

echo 'filesize:              ';
var_dump(filesize($file));

echo 'strlen:                ';
var_dump(strlen($xml));

echo 'simplexml object?      ';
var_dump(is_object(simplexml_load_string($xml)));

echo 'Last 50 characters:    ';
var_dump(substr($xml, -50));

Windows でローカルに出力:

filesize:              int(21893604)
strlen:                int(21893604)
simplexml object?      bool(true)
Last 50 characters:    string(50) "RD DR    CT  Watertown   203-555-5555            </DATA>
</RETS>"

リモート UNIX サーバーでの出力:

filesize:              int(21884093)
strlen:                int(21884093)
simplexml object?      
Warning: simplexml_load_string(): Entity: line 9511: parser error : internal error in /path/to/test.php on line 19

Warning: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN  in /path/to/test.php on line 19

Warning: simplexml_load_string():                                                                                ^ in /path/to/test.php on line 19

Warning: simplexml_load_string(): Entity: line 9511: parser error : Extra content at the end of the document in /path/to/test.php on line 19

Warning: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN  in /path/to/test.php on line 19

Warning: simplexml_load_string():                                                                                ^ in /path/to/test.php on line 19
bool(false)
Last 50 characters:    string(50) "ORD DR   CT  Watertown   203-555-5555            </DATA>
</RETS>"

コメントと追加情報への返信:

  • 私が知る限り、XML 自体は有効であるように見えます (私のシステムで動作します)。

  • magic_quotes_runtimeは間違いなくオフです。

  • 動作中のサーバーには libxml バージョン 2.7.7 があり、もう一方のサーバーには 2.7.6 があります。それは本当に違いを生むことができますか?libxml の変更ログは見つかりませんでしたが、可能性は低いようです。

  • これは、応答/ファイルが特定のサイズを超えている場合にのみ発生するようで、エラーは常に最後から 2 番目の行で発生します。

  • メモリの問題は発生していません。テスト スクリプトはすぐに実行されます。

どの構成が関連しているかがわかっている場合は、投稿できる PHP 構成に違いがあります。問題が何であるか、または他に確認したいことを知っていますか?

4

3 に答える 3

33

libxml2の変更ログには、「608773 add a missing check in xmlGROW (Daniel Veillard)」が含まれており、これは入力バッファリングに関連していると思われます。libxml2 の内部については何も知らないことに注意してください。

直接使用した場合に動作が異なるかどうかを確認simplexml_load_file()し、libxml パーサー関連のオプションを設定してみてください。

simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE)

LIBXML_PARSEHUGE具体的には、フラグを試してみてください。

http://php.net/manual/en/libxml.constants.php
XML_PARSE_HUGEフラグは、パーサーからハードコーディングされた制限を緩和します。これは、ドキュメントの最大深度やエンティティの再帰などの制限、およびテキスト ノードのサイズの制限に影響します。

于 2013-02-21T19:17:43.160 に答える
2

あなたの XML は無効であり、どちらの場合でも問題が発生するはずです。

ルートは 1 つだけ必要です。

すなわち。すべてがタグ内にある必要があります。

<?xml version="1.0"?>
<RETS>
    ...
</RETS>

XML に複数のルートがあるため、問題が発生します :-)

すべてをルート ノードにラップしてみて、機能するかどうかを確認してください。

<?xml version="1.0"?>
<rootNode>
    <RETS>
    ...
    </RETS>
    <count bla="99" />
</rootNode>

それがlibxmlの違いなのか、それともエラーレポートのレベルが異なるのか、一方では機能し、他方では機能しないのかはわかりませんが、それが問題のように見えます。

于 2013-02-26T12:19:25.457 に答える
0

私のXMLSpyは、あなたのXMLファイル(あなたが提供したリンクからダウンロードしたもの)に問題がなく、整形式であることを確認しました。

ただし、潜在的な問題の1つは、「encoding」属性がXMLプリアンブルにないという事実です。libxml2のバージョンによっては、次のシナリオが考えられると思います。サーバーがエンコーディング属性をチェックします。いくつかのデフォルト値(構成設定)。たぶん、古いバージョンのライブラリはBOMをチェックしません。

このリンクも参照してください。libxmlでも同様のエンコーディングの問題がありました: https ://stackoverflow.com/questions/4724241/utf-8-problems-with-php-dom-on-debian-server

その本質は、libxmlライブラリのアップグレードが実際に問題を解決する可能性があるということです。または、構成のデフォルトのエンコード設定を確認する価値があるかもしれません。

私のXMLSpyによると、ファイルはutf-8でエンコードされています-テストとして、指定するかどうかを確認する価値があるかもしれません

<?xml version="1.0" encoding="UTF-8"?>

ファイルのプリアンブルがUnixサーバーの窒息を防ぐためです。

于 2013-02-26T12:42:24.887 に答える