web-dev-qa-db-fra.com

Les hooks sont-ils appelés de manière synchrone?

Je ne savais pas trop comment poser cette question. Dans WP, lorsque le programme est exécuté, est-ce que tout est "séquentiel"? J'entends par là que WP décroche et raccroche, appelez-le, attendez, puis continuez, synchrone? Il n'y a pas d'injection de dépendance d'IoC que je pouvais trouver ni d'async.

J'ai regardé le noyau, et je ne pouvais pas dire. J'ai vu des références à quelques variables globales et un tableau de hooks itérés, mais je n'ai pas compris l'exécution. J'ai essayé avec xdebug, mais je ne l'ai pas encore compris.

4
johnny

do_action() et apply_filters() sont les deux wrappers du

WP_Hook::apply_filters()

méthode, qui appelle les rappels enregistrés dans sequential order ( src ).

Voici un test simple:

Définissons un wrapper de rappel:

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

Ensuite, nous enregistrons les rappels à l’action mytest:

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

Ensuite, nous appelons les rappels et mesurons le temps qu'il faut:

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

et l'afficher avec:

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

Voici les résultats de 5 tests:

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

où l'ordre est le même pour chaque exécution, avec un total de c.a. 9 secondes, comme prévu pour un ordre d'exécution séquentiel.

5
birgire

Oui, tout est linéaire/séquentiel . Il n'y a pas d'exécution multi-thread ou parallèle dans une application PHP. Les crochets WordPress s'exécutent séquentiellement .

Lorsque vous vous connectez à une action ou à un filtre, votre code ajoute simplement un objet callable à un tableau quelque part. Lorsque l'action est déclenchée, WordPress effectue une boucle sur ces callables et les appelle. En résumé, les actions et les filtres utilisent le même système et sont techniquement identiques.

Il est logique de penser à des actions et à des points d'ancrage comme événements déclenchés manuellement dans un scénario linéaire, plutôt que comme des rappels d'un processus dans un autre thread.

En fonction du fonctionnement de Node, vous pouvez penser que vous pouvez utiliser des points d'ancrage pour éliminer des tâches longues ou coûteuses pour un autre thread. Ce n'est pas le cas, et l'exécution d'une boucle infinie dans un hook provoquera l'expiration du processus. Les processus PHP sont exécutés individuellement et ne sont pas thread-safe. Vous pouvez générer des processus supplémentaires, mais c'est entièrement à vous de les gérer et ils ont leurs propres problèmes.

4
Tom J Nowell