Крючки называются синхронно?
Я не был уверен, как спросить об этом. В WP, когда программа запускается, все ли это "последовательно"? Под этим я подразумеваю, попадает ли WP на крючок, который вы зарегистрировали, и вызывает его, подождите, затем продолжайте, синхронно? Там нет инъекции зависимостей IoC, которую я мог бы найти, и нет асинхронности.
Я посмотрел в сердцевину, и я не мог сказать. Я видел ссылки на несколько глобальных переменных и множество повторяющихся крючков, но я не понял выполнения. Я пытался с помощью xdebug, но у меня есть еще не понял этого.
2 answers
do_action()
и apply_filters()
являются оболочками
WP_Hook::apply_filters()
Метод, который вызывает зарегистрированные обратные вызовы в последовательном порядке (src).
Вот простой тест:
Давайте определим оболочку обратного вызова:
$callback_gen = function( $seconds ) {
return function() use ( $seconds ) {
sleep( $seconds );
printf( '%s finished' . PHP_EOL, $seconds );
};
};
Далее мы регистрируем обратные вызовы для действия mytest
:
add_action( 'mytest', $callback_gen( 3 ) );
add_action( 'mytest', $callback_gen( 5 ) );
add_action( 'mytest', $callback_gen( 1 ) );
Затем мы вызываем обратные вызовы и измеряем время, необходимое для этого:
$start = microtime( true );
do_action( 'mytest' );
$stop = microtime( true );
И отобразите его с помощью:
echo number_format( $stop - $start, 5 );
Вот результаты из 5 тестовых запусков:
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
Где порядок одинаков для каждого запуска, в общей сложности около 9 секунд, как и ожидалось для последовательного порядка запуска.
Да, все это линейно/последовательно. В PHP-приложении нет многопоточного или параллельного выполнения. Крючки WordPress запускаются последовательно.
Когда вы подключаетесь к действию или фильтру, ваш код просто добавляет объект callable
в какой-нибудь массив. Когда действие срабатывает, WordPress перебирает эти callables
и вызывает их. В качестве примечания, действия и фильтры используют одну и ту же систему и технически одинаковы.
Имеет смысл думать или действовать и зацеплять как события, запущенные вручную на линейной временной шкале, а не обратные вызовы от процесса в другом потоке,
Основываясь на том, как все работает в узле say, вы можете полагать, что можете использовать крючки для переноса длительных задач или дорогостоящей работы в другой поток. Это не так, и выполнение бесконечного цикла в крючке приведет к тайм-ауту процесса. Процессы PHP выполняются однопоточно и не являются потокобезопасными, вы можете создавать дополнительные процессы, но это полностью ваше дело, и у вас есть свои собственные вопросы.