PHP 层支持 Hook 机制
有很多场景,我们希望不修改 PHP 代码就可以注入一些 Hook 函数到Server或Client中。使用Hook机制就可以支持这些功能。
Hook API将加入Runtime模块。
API
function Runtime::addHook(int $hook_type, callable $function, int $priority = false) : int;
function Runtime::delHook(int $hook_id);
-
addHook即可添加一个Hook,$hook_type指定在什么情况下执行,$function是回调的函数,成功设置返回hook的$id -
addHook的第三个参数可以指定优先级,数值越大表示优先级越高,会先于优先级低的Hook执行,最大为PHP_INT_MAX - 在
delHook可移除此钩子
Swoole\Runtime::addHook(SWOOLE_HOOK_BEFORE_SERVER_START, function (Swoole\Server $server) {
var_dump($server->setting);
});
上面的例子就是添加了一个服务器启动的Hook,在$server->start()之前,这个函数会被回调。
Hook Type
目前会先增加5种Hook,在新版本迭代中,会根据实际需要增加更多的Hook Type
-
SWOOLE_HOOK_BEFORE_SERVER_START在$server->start()之前调用 -
SWOOLE_HOOK_BEFORE_WORKER_START在onWorkerStart回调之前调用 -
SWOOLE_HOOK_BEFORE_SERVER_SHUTDOWN在服务器收到SIGTERM信号后,关闭之前调用 -
SWOOLE_HOOK_BEFORE_WORKER_STOP在Worker进程收到SIGTERM信号后,即将推出之前调用 -
SWOOLE_HOOK_BEFORE_SERVER_RELOAD在收到SIGUSR1信号后,重启Worker进程之前调用
应用场景
例如下列场景就可以使用Hook无侵入地实现:
-
Web Admin,可以在服务器启动前使用addListener()添加一个Http的端口提供Admin Web界面 -
Remote Shell可以额外添加一个端口,实现远程登录,调试服务器 -
Agent可以在服务器启动前使用addProcess添加一个自定义进程做为Agent -
Reload User Process,reload功能对User Process是无效的,可以利用这个Hook在重启Worker时同时重启用户进程 -
pid file,在启动时可以检测是否设置了pid_file,如果没有,可以设置一个
支持,很有用。
支持支持
mark
业务代码层面也能实现相应的功能。
正打算实现reload 自定义进程,这样只需加hook SWOOLE_HOOK_BEFORE_SERVER_RELOAD,再写reload自定义进程的逻辑。
@hhxsv5 自定义进程的生命周期与 Master Manager 是相同的,因此不会接受 reload 信号。你这个需求属于特殊需求,因此需要增加一些 php 代码来实现。
@hhxsv5 自定义进程的生命周期与 Master Manager 是相同的,因此不会接受 reload 信号。你这个需求属于特殊需求,因此需要增加一些 php 代码来实现。
是的,有了这个hook后,自己实现自定义进程的reload逻辑
有了这个功能很多进程监控更方便了
支持
和监听Server事件冲突了吧,是否有些多余