挂钩是同步调用的吗?

时间:2017-05-05 作者:johnny

我不知道该怎么问这个。在WP中,当程序运行时,是否都是“连续的”?我的意思是,WP是否命中了您注册的挂钩并调用它,等待,然后继续,同步?我找不到IoC的依赖注入,也没有异步。

我看了看核心,我说不出来。我看到了对几个全局变量的引用和迭代的钩子数组,但我不理解执行过程。我尝试使用xdebug,但我还没有掌握它。

2 个回复
最合适的回答,由SO网友:birgire 整理而成

这个do_action()apply_filters() 都是

WP_Hook::apply_filters()
方法调用中注册的回调sequential 订单号(src).

Here\'s a simple test:

让我们定义一个回调包装器:

$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秒,与连续运行顺序相同。

SO网友:Tom J Nowell

Yes it\'s all linear/sequential. PHP应用程序中没有多线程或并行执行。WordPress hooks run sequentially.

当你钩住一个动作或过滤器时,你的代码只是在添加一个callable 对象指向某个数组。当动作触发时,WordPress会在这些callables 给他们打电话。作为旁注,操作和过滤器使用相同的系统,并且在技术上是相同的。

将或操作和挂钩视为线性时间线中的手动触发事件,而不是从另一个线程中的进程回调,这是有意义的,

根据say节点中的工作方式,您可能认为可以使用挂钩将长时间运行的任务或昂贵的工作分配给另一个线程。事实并非如此,在挂钩中运行无限循环将导致进程超时。PHP进程运行单线程,并且不是线程安全的,您可以生成其他进程,但这完全由您来管理,并且有自己的问题。

相关推荐

Implement Hooks Using Array

我试图在一个主题中实现一些钩子,但不是用重复的代码写出每个钩子,而是想知道是否可以使用和数组来声明钩子。E、 g.通常,我会使用类似以下内容:function hook_name_1() { do_action( \'hook_name_1\' ); } function hook_name_2() { do_action( \'hook_name_2\' ); } 有没有办法将钩子名称放入一个数组中,然后用一个foreach循环