Крючки называются синхронно?


Я не был уверен, как спросить об этом. В WP, когда программа запускается, все ли это "последовательно"? Под этим я подразумеваю, попадает ли WP на крючок, который вы зарегистрировали, и вызывает его, подождите, затем продолжайте, синхронно? Там нет инъекции зависимостей IoC, которую я мог бы найти, и нет асинхронности.

Я посмотрел в сердцевину, и я не мог сказать. Я видел ссылки на несколько глобальных переменных и множество повторяющихся крючков, но я не понял выполнения. Я пытался с помощью xdebug, но у меня есть еще не понял этого.

 4
Author: johnny, 2017-05-05

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 секунд, как и ожидалось для последовательного порядка запуска.

 5
Author: birgire, 2017-05-06 04:57:20

Да, все это линейно/последовательно. В PHP-приложении нет многопоточного или параллельного выполнения. Крючки WordPress запускаются последовательно.

Когда вы подключаетесь к действию или фильтру, ваш код просто добавляет объект callable в какой-нибудь массив. Когда действие срабатывает, WordPress перебирает эти callables и вызывает их. В качестве примечания, действия и фильтры используют одну и ту же систему и технически одинаковы.

Имеет смысл думать или действовать и зацеплять как события, запущенные вручную на линейной временной шкале, а не обратные вызовы от процесса в другом потоке,

Основываясь на том, как все работает в узле say, вы можете полагать, что можете использовать крючки для переноса длительных задач или дорогостоящей работы в другой поток. Это не так, и выполнение бесконечного цикла в крючке приведет к тайм-ауту процесса. Процессы PHP выполняются однопоточно и не являются потокобезопасными, вы можете создавать дополнительные процессы, но это полностью ваше дело, и у вас есть свои собственные вопросы.

 4
Author: Tom J Nowell, 2017-05-05 22:19:58