Werden Hooks synchron aufgerufen?

Ich war mir nicht sicher, wie ich das fragen sollte. In WP, wenn das Programm läuft, ist alles “sequenziell”? Damit meine ich, schlägt WP den Haken, den Sie registriert haben und rufen Sie es ab, warten Sie, und fahren Sie fort, synchron? Es gibt keine Abhängigkeitsinjektion von IoC, die ich finden konnte und keine Asynchronität.

Ich sah einen core aus, und ich konnte es nicht sagen. Ich sah Referenzen auf ein paar globale Variablen und eine Reihe von Hooks, die über iteriert wurden, aber ich habe die Ausführung nicht verstanden. Ich habe versucht, mit xdebug, aber ich habe es noch nicht begriffen.

Solutions Collecting From Web of "Werden Hooks synchron aufgerufen?"

Die do_action() und apply_filters() sind beide Wrapper der

 WP_Hook::apply_filters() 

Methode, die die registrierten Callbacks in sequentieller Reihenfolge aufruft ( src ).

Hier ist ein einfacher Test:

Definieren wir einen Callback-Wrapper:

 $callback_gen = function( $seconds ) { return function() use ( $seconds ) { sleep( $seconds ); printf( '%s finished' . PHP_EOL, $seconds ); }; }; 

Als nächstes registrieren wir die Callbacks für die mytest Aktion:

 add_action( 'mytest', $callback_gen( 3 ) ); add_action( 'mytest', $callback_gen( 5 ) ); add_action( 'mytest', $callback_gen( 1 ) ); 

Dann rufen wir die Callbacks auf und messen die benötigte Zeit:

 $start = microtime( true ); do_action( 'mytest' ); $stop = microtime( true ); 

und zeige es an mit:

 echo number_format( $stop - $start, 5 ); 

Hier sind die Ergebnisse von 5 Testläufen:

 3 finished 5 finished 1 finished 9.00087 3 finished 5 finished 1 finished 9.00076 3 finished 5 finished 1 finished 9.00101 3 finished 5 finished 1 finished 9.00072 3 finished 5 finished 1 finished 9.00080 

wobei die Reihenfolge für jeden Lauf gleich ist, mit einer Gesamtdauer von ca. 9 Sekunden, wie für eine sequenzielle Laufreihenfolge erwartet.

Ja, es ist alles linear / sequenziell . In einer PHP-Anwendung gibt es keine Multi-Threading- oder parallele Ausführung. WordPress-Hooks werden nacheinander ausgeführt .

Wenn Sie sich in eine Aktion oder einen Filter callable fügt Ihr Code einem Array nur ein callable Objekt hinzu. Wenn die Aktion ausgetriggers wird, wiederholt WordPress diese callables und ruft sie auf. Als eine Nebenbemerkung verwenden Aktionen und Filter das gleiche System und sind technisch identisch.

Es macht Sinn, zu denken oder Aktionen und Hooks als manuell ausgetriggerse Ereignisse in einer linearen Zeitleiste, anstatt Callbacks von einem process in einem anderen Thread,

Je nachdem, wie die Dinge in einem Knoten funktionieren, können Sie glauben, dass Sie mit Hilfe von Hooks lange laufende Aufgaben oder teure Arbeiten in einem anderen Thread ausgliedern können. Dies ist nicht der Fall, und das Ausführen einer Endlosschleife in einem Hook führt zu einem Timeout des processes. PHP-processe laufen einthreaded und sind nicht threadsicher, Sie können zusätzliche processe generieren, aber das ist nur für Sie zu verwalten und hat eigene Probleme.