2009-03-30 3 views
0

WebサービスからXMLを取得し、MiniXml(PHP)にロードしています。ファイルが100kより小さい場合、それはちょうど良い解析です。大きいと、エラーが発生します:MiniXml(php)が100kを超えるファイルを解析できません

Call to a member function getElement() on a non-object

これは、ルート要素から最初の要素を取り除こうとすると起こります。

$parsedDoc = new MiniXMLDoc(); 
$parsedDoc->fromString($xml); 
$root =& $parsedDoc->getElement('my-root-element'); 
$lists =& $root->getElement($type); 

私が呼び出すWebサービスでは、呼び出すトップレベル要素の数を指定できます。 100kを超えるサイズをとる最後の要素は整形式であり、問​​題はまったくありません。私が考えることができるのはサイズだけです。この場合、サイズは重要ですか?

更新:私はこれがバッファの問題だと思いますが、どのバッファが問題の原因かわかりません。私はそれがすべてのデータを取得していることを知っているので、 "Webサービス呼び出し"ではないと確信しています。それは問題を引き起こしているPHPバッファまたはMiniXmlバッファですか?それとも全く別のものなのでしょうか? (ありがとうダンこれを指摘してください)

答えて

6

私はこの全く同じ事を、when converting HTML to PDFについて話しました。

This bugがこの問題を説明しています。 PHP 5.2.xでは新しいパラメータpcre.backtrack_limitが導入され、デフォルト値は100,000となっています。基本的にpreg_ *関数はPHP 5.2以降、100Kを超える文字列で暗黙的に失敗するです。ちなみに、バグはまだ残っています。これについては何も行われていません。

制限値が低すぎます。あなたがオプションを持っていれば、それを2,000,000(好きなもの)のようにすることができます。それが共有ホスティング環境にない可能性のあるオプションではない場合は、問題が発生します。

私はそれを見つけたときに本当にこのことを信じられませんでした。この変更は、テンプレートコードのヒープを破るだけでなく(多くのスレッド、バグレポート、上記のすべてのコメントが証明されます)、エラーは発生しません(preg_last_error()を見た場合を除き、ほとんどの人しないでください)。

+0

クレタス、ありがとう!これは私が持っている問題のようです。私は共有ホスト上にあり、メモリが不足しているので、これはプロバイダと一緒に作業しなければならない問題です。再度、感謝します! – Sixty4Bit

0

私はPHPについてはほとんど分かりませんし、MiniXmlについては何も分かりませんが、おそらくあなたは< = 100Kという大きさの入力バッファを持っているので、 MiniXMLでは、ドキュメント内の最上位の要素に閉じるタグがありません。 (最後にあなたが引用した要素がうまく構成されているかどうかとは異なるでしょう)

+0

これはまさに私が考えていたものですが、バッファの指定場所がわかりません。それはPHPバッファーですか? MiniXmlバッファ?私は私の質問を更新します。ありがとう! – Sixty4Bit

+0

PHPのメモリ制限は、デフォルトでは16Mに設定されています.100kbはPHPに関する限り面倒ではありません。 – nickf

関連する問題