25
Mar
2009

PHP, et les PCRE qui ne fonctionnent plus

Logo PHP

Attention, ce qui suit ne s'adresse qu'aux développeurs PHP. Qui utilisent les PCRE (Expressions rationnelles compatibles Perl). Qui manipulent de très gros fichiers (par exemple des bons gros fichiers XML à analyser)

Depuis PHP 5.2.0, il existe une nouvelle option de configuration dans le php.ini, concernant les PCRE :

pcre.backtrack_limit

Cette option de configuration, définie par défaut à 100 000, détermine la longueur maximale des chaines à traiter et à retourner par les fonctions PCRE PHP (preg_match, entre autres).

Concrètement, si vous avez un fichier de 50 Mo à analyser en PHP (en CLI hein, pas via Apache, ne soyez tout de même pas trop barbare), et que les blocs que vous cherchez à extraire via une RegExp font plus 100 Ko, cette limitation vous empêchera de les avoir.

Le pire, dans tout ça, c'est qu'aucune alerte ni même notice ne vous est renvoyée. Rien. Que dalle. Nada.

Seul moyen de vérifier ça ? Placer un appel à la fonction preg_last_error() après chaque RegExp. Lourd, et inutile, à mon sens.

Maintenant, je comprends mieux pourquoi mon catalogue produit ne retrournait qu'un seul élement, au lieu des 350 présent réellement dedans.

Maintenant, vous êtes au courant, ça vous évitera de perdre 2 bonnes heures à chercher où ça coince ;) (comment ça, c'est du vécu ?)

Posté par Mathieu LESNIAK à 16:06 dans la catégorie Projets | RSS catégorie
Tag(s) associé(s) :
sirius
31/05/2009 05:11:46

Merci du tuyau, car c'est pas du tout documenté correctement cette affaire là ...

Ajouter un commentaire :




security code

Le HTML n'est pas autorisé dans les commentaires, et il sera affiché tel quel.
Les retours à la ligne seront automatiquement transformés en <br/>.
Pour insérer un lien, tapez juste l'url entre [ ].
Les smileys les plus courant seront remplacés par les images associées.
Les commentaires sont propriétés de leurs auteurs respectifs, le propriétaire de ce site ne pourra en être tenu pour responsable