2015-02-18 11 views
6

die manuellen Zustände PHP folgendes über die „S“ des PCRE (Extra-Analyse der Muster) Modifikator auf http://php.net/manual/en/reference.pcre.pattern.modifiers.phpPCRE PHP Konkretes Beispiel für die Verwendung und den Nutzen des Modifikators "S" (Extra-Analyse des Musters)?

S

Wenn ein Muster mehrmals werden wird verwendet, ist es Ausgaben wert mehr Zeit, es zu analysieren, um die Zeit für das Zusammenbringen zu beschleunigen. Wenn dieser Modifikator gesetzt ist, wird diese zusätzliche Analyse durchgeführt. Derzeit ist das Studieren eines Musters nur für nicht verankerte Muster nützlich, die kein einziges festes Anfangszeichen haben.

So ist seine Verwendung auf Muster verwendet, die mehrmals verwendet werden soll, ohne Anker in sie (wie ^, $) oder einer festen Start char Sequenz, z.B. in einem Muster wie '/^abc/'.

Aber es gibt keine spezifischen Details darüber, wo z.B. Wenden Sie diesen Modifikator an und wie es tatsächlich funktioniert.

Gilt es nur für den PHP-Thread des aktuell ausgeführten Skripts und nachdem das Skript ausgeführt wurde, ist die "Cache" -Analyse des Musters verloren gegangen? Oder speichert die Engine die Analyse des Musters in einem globalen Cache, der dann mehreren PHP-Threads zur Verfügung gestellt wird, die PCRE mit dem mit diesem Modifikator markierten Muster verwenden?

Auch von der Einführung PCRE: http://php.net/manual/en/intro.pcre.php

Hinweis: Diese Erweiterung eine globale Pro-Thread unterhält Cache von kompilierten regulären Ausdrücken (bis 4096)

Wenn die "S" Der Modifikator wird nur pro Thread verwendet. Wie unterscheidet er sich vom PCRE-Cache kompilierter Regexps? Ich vermute, dass zusätzliche Informationen gespeichert werden, so wie MySQL es tut, wenn es die Zeilen in einer Tabelle indiziert (im Falle von PCRE wird diese zusätzliche Information natürlich im Speicher gespeichert).

Zuletzt, aber nicht zuletzt, hat jemand einen echten Anwendungsfall erlebt, in dem er/sie diesen Modifikator verwendet hat und haben Sie eine Verbesserung bemerkt und schätzen seine Vorteile?

Danke für die Aufmerksamkeit.

+1

Ich kenne nicht die Implementierungsdetails von PHP Verwendung von PCRE, aber in PCRE v10 wird immer studiert. Und PCRE selbst hat keinen Cache kompilierter Regexe. Beim Studieren wird überprüft, ob für ein bestimmtes Muster einige Optimierungen möglich sind. –

+0

Vielen Dank für Ihren Kommentar, wie auch immer, Sie sagen, dass der Lernmechanismus so etwas wie "Analysieren der Regexp-Struktur und Neuschreiben in einem performanteren Muster" macht, ist es richtig? – tonix

+1

Nicht genau. Ich zitiere die Dokumente: * Studieren eines Musters macht zwei Dinge: erstens, eine untere Grenze für die Länge der Betreff-Zeichenfolge, die benötigt wird, um das Muster zu entsprechen, ist berechnet. [...] Das Studieren eines Musters ist auch nützlich für nicht verankerte Muster, die kein einziges festes Anfangszeichen haben. Eine Bitmap von möglichen Startbytes wird erstellt. Dies beschleunigt das Finden einer Position in dem Subjekt, bei dem der Abgleich beginnen soll. * –

Antwort

2

PHP-Dokumente zitieren einen kleinen Teil der PCRE-Dokumente. Hier sind einige weitere Details (Hervorhebung von mir) von PCRE 8.36:

Wenn eine kompilierte Muster mehrmals werden wird verwendet, lohnt es sich, mehr Zeit verbringen sie zu analysieren, um die Zeit zu beschleunigen genommen für passend. Die Funktion pcre_study() nimmt als erstes Argument einen Zeiger auf ein kompiliertes Muster. Wenn das Studieren des Musters zusätzliche Informationen liefert, die helfen, die Übereinstimmung zu beschleunigen, gibt pcre_study() einen Zeiger auf einen pcre_extra Block zurück, in dem das Feld study_data auf die Ergebnisse der Studie zeigt.

...

ein Muster Studieren macht zwei Dinge: Erstens, eine untere Schranke für die Länge der Zeichenkette, die dem Muster entsprechen benötigt wird, wird berechnet. Dies bedeutet nicht, dass es Strings dieser Länge gibt, die übereinstimmen, aber es garantiert, dass keine kürzeren Strings übereinstimmen. Der Wert wird verwendet, um Zeitverschwendung zu vermeiden, indem versucht wird, Strings zu finden, die kürzer als die untere Grenze sind. Sie können den Wert in einem aufrufenden Programm über die Funktion pcre_fullinfo() herausfinden.

Das Studieren eines Musters ist auch für nicht verankerte Muster nützlich, die keinen festen Startzeichen haben. Eine Bitmap möglicher Startbytes wird erstellt. Dies beschleunigt das Finden einer Position in dem Subjekt, bei der die Übereinstimmung beginnen soll. (im 16-Bit-Modus, die Bitmap für 16-Bit-Werte von weniger als 256. In einem 32-Bit-Modus verwendet werden, wird die Bitmap weniger für 32-Bit-Werte verwendet als 256.)

Bitte beachten Sie, dass In der späteren PCRE-Version (v10.00, auch PCRE2 genannt) hat die lib ein massives Refactoring und API Redesign durchlaufen. Eine der Konsequenzen ist, dass Studieren immer in PCRE 10.00 und höher durchgeführt wird. Ich weiß nicht, wann PHP von PCRE2 Gebrauch machen wird, aber es wird früher oder später passieren, weil PCRE 8.x von nun an keine neuen Funktionen mehr bekommen wird.

Hier ist ein Zitat aus dem PCRE2 release announcment:

Explicit „Studium“ von kompilierten Muster abgeschafft wurde - es jetzt immer geschieht automatisch. Das JIT-Kompilieren wird durchgeführt, indem nach einer erfolgreichen Rückkehr von pcre2_jit_compile() eine neue Funktion aufgerufen wird.


Was Ihre zweite Frage:

Wenn der "S" Modifikator pro Thread wird nur verwendet, wie funktioniert es vom PCRE-Cache von kompilierten regexps unterscheidet?

Es gibt keinen Cache in PCRE selbst, sondern PHP verwaltet einen Cache von regulären Ausdrücken neu zu kompilieren das gleiche Muster über zu vermeiden und immer wieder, zum Beispiel im Fall, dass Sie verwenden, um eine preg_ Funktion in einer Schleife.

+0

Danke fürs Beantworten! – tonix