2009-03-30 3 views
0

Je récupère du code XML à partir d'un service Web, puis je le charge dans MiniXml (PHP). Lorsque le fichier est inférieur à 100k, il analyse très bien. Plus grand, et j'obtiens une erreur:MiniXml (php) impossible d'analyser les fichiers de taille supérieure à 100k

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

Cela se produit lorsque j'essaie de retirer le premier élément de l'élément racine. Le service Web que j'appelle me permet de spécifier le nombre d'éléments de niveau supérieur à appeler. Le dernier élément qui prend la taille de plus de 100k est bien formé et n'a aucun problème. La seule chose à laquelle je peux penser est la taille. Dans ce cas, la taille est-elle importante? Je pense qu'il s'agit d'un problème de mémoire tampon, mais je ne sais pas quel tampon cause le problème. Je suis sûr que ce n'est pas "l'appel de service Web" parce que je sais qu'il récupère toutes les données. Est-ce un tampon PHP ou un tampon MiniXml qui cause le problème? Ou est-ce autre chose entièrement? (Merci Dan de l'avoir fait remarquer)

Répondre

6

Je suis tombé sur exactement la même chose que j'ai parlé de when converting HTML to PDF.

This bug décrit le problème. PHP 5.2.x a introduit un nouveau paramètre pcre.backtrack_limit, par défaut à une valeur de 100 000. Fondamentalement, toute fonction preg_ * échouera silencieusement sur les chaînes supérieures à 100k depuis PHP 5.2. D'ailleurs, le bug mentioend reste ouvert. Rien n'a été fait à ce sujet.

La limite est trop faible. Si vous avez l'option augmentez-la à 2 000 000 (ou tout ce dont vous avez besoin). Si ce n'est pas une option - ce qui pourrait ne pas l'être dans un environnement d'hébergement partagé - alors vous avez des problèmes.

Je ne pouvais vraiment pas croire celui-ci quand je l'ai trouvé. Non seulement cette modification a brisé des tas de code de templates (autant de threads, rapports de bugs et commentaires sur tout ce qui précède en attestent) mais aucune erreur n'est soulevée (sauf si vous regardez preg_last_error(), la plupart des gens ne pas).

+0

cletus, merci! Cela ressemble à la question que j'ai. Je suis sur un hôte partagé et à court de mémoire, donc c'est un problème que je vais devoir travailler avec le fournisseur. Merci encore! – Sixty4Bit

0

Je connais peu de choses sur php et rien sur MiniXml, mais ce qui vient à l'esprit est que peut-être vous avez un tampon d'entrée qui est < = 100K, et donc quand il est introduit dans MiniXML, la balise de fermeture est manquante dans l'élément de niveau supérieur du document. (Ce serait une question différente de savoir si le dernier élément que vous avez cité, étant bien formé.)

+0

C'est exactement ce que je pensais, mais je ne sais pas où les tampons sont spécifiés. Est-ce un tampon PHP? Un tampon MiniXml? Je vais mettre à jour ma question. Merci! – Sixty4Bit

+0

La limite de mémoire de PHP est fixée à 16M par défaut, je pense .. 100kb ne devrait pas être compliqué en ce qui concerne PHP. – nickf

Questions connexes