PCRE Backtrack Limit in PHP 5.2

Eine Frage an die PHP-Experten unter meinen Lesern. Mal wieder, ja … Aber diesmal stecke ich echt fest und weiß keine Lösung!

Loudblog hat ziemliche Probleme mit PHP 5.2. Ich habe das jetzt soweit lokalisieren können, dass ich eine konkrete Frage stellen kann.

Für das Parsen und Dynamisieren der Loudblog-Templates verwende ich rekursive Schleifen mit Regular Expressions. Jaja, das soll man nicht, aber es ist jetzt nun mal so. Das Problem: Pro Seitenabruf werden locker über 200 preg_match_all() oder preg_replace() Aktionen aufgerufen. Doch PHP 5.2 sagt nach 128 solcher Aufrufe Tschüss und weigert sich, das Template weiterzuparsen.

Das Problem scheint das in PHP 5.2 neu hinzugekomme backtrack_limit zu sein. Was genau das ist und wie man das irgendwie zurücksetzen kann, weiß ich nicht. php.ini bringt mir nichts, denn Loudblog soll auch auf 08/15-Servern laufen, bei denen man keine Konfigurationsrechte besitzt.

Also: Wie kann man diese backtrack-Zeugs resetten, löschen oder deaktivieren, damit ich weiterhin große Mengen von RegEx-Befehlen aufrufen kann. Die Performance beinträchtigt es im Übrigen nicht – Ein durchschnittliches Template ist in 0.2 Sekunden fertig gerendert.

Nachtrag am 12.2.2007: Abgesehen davon, dass ich am Wochenende die komplette Parsing-Engine einmal mit DOM und einmal mit SimpleXML nachgebaut haben, um das Problem zu umgehen, ist die eigentliche Lösung des Problems schnell erzählt und hat nichts mit Qualität, sondern mit Quantität zu tun. Es handelt sich um exakt eine Zeile Code, die ich einfügen musste:

ini_set('pcre.backtrack_limit', 1000000);

Das Standard-Limit für Backtracks liegt bei PHP auf 100.000, ich erhöhe es einfach auf 1 Million. Fertig. Naja, das ist natürlich keine Entschuldigung für den miesen Code, aber pragmatisch und schnell. Danke für die Inspiration an Sebastian Steins.