rfc icon indicating copy to clipboard operation
rfc copied to clipboard

PHP 层支持 Hook 机制

Open matyhtf opened this issue 7 years ago • 10 comments

有很多场景,我们希望不修改 PHP 代码就可以注入一些 Hook 函数到ServerClient中。使用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

目前会先增加5Hook,在新版本迭代中,会根据实际需要增加更多的Hook Type

  • SWOOLE_HOOK_BEFORE_SERVER_START$server->start()之前调用
  • SWOOLE_HOOK_BEFORE_WORKER_STARTonWorkerStart回调之前调用
  • SWOOLE_HOOK_BEFORE_SERVER_SHUTDOWN 在服务器收到SIGTERM信号后,关闭之前调用
  • SWOOLE_HOOK_BEFORE_WORKER_STOPWorker进程收到SIGTERM信号后,即将推出之前调用
  • SWOOLE_HOOK_BEFORE_SERVER_RELOAD 在收到SIGUSR1信号后,重启Worker进程之前调用

应用场景

例如下列场景就可以使用Hook无侵入地实现:

  • Web Admin,可以在服务器启动前使用addListener()添加一个Http的端口提供Admin Web界面
  • Remote Shell 可以额外添加一个端口,实现远程登录,调试服务器
  • Agent 可以在服务器启动前使用addProcess添加一个自定义进程做为Agent
  • Reload User Processreload功能对User Process是无效的,可以利用这个Hook在重启Worker时同时重启用户进程
  • pid file,在启动时可以检测是否设置了pid_file,如果没有,可以设置一个

matyhtf avatar Feb 25 '19 01:02 matyhtf

支持,很有用。

8923052 avatar Feb 25 '19 01:02 8923052

支持支持

2pgcn avatar Feb 25 '19 01:02 2pgcn

mark

ghost avatar Feb 25 '19 01:02 ghost

业务代码层面也能实现相应的功能。

similarJ avatar Feb 25 '19 01:02 similarJ

正打算实现reload 自定义进程,这样只需加hook SWOOLE_HOOK_BEFORE_SERVER_RELOAD,再写reload自定义进程的逻辑。

hhxsv5 avatar Feb 25 '19 01:02 hhxsv5

@hhxsv5 自定义进程的生命周期与 Master Manager 是相同的,因此不会接受 reload 信号。你这个需求属于特殊需求,因此需要增加一些 php 代码来实现。

matyhtf avatar Feb 25 '19 03:02 matyhtf

@hhxsv5 自定义进程的生命周期与 Master Manager 是相同的,因此不会接受 reload 信号。你这个需求属于特殊需求,因此需要增加一些 php 代码来实现。

是的,有了这个hook后,自己实现自定义进程的reload逻辑

hhxsv5 avatar Feb 25 '19 03:02 hhxsv5

有了这个功能很多进程监控更方便了

v3u3i87 avatar Mar 14 '19 04:03 v3u3i87

支持

aierui avatar Apr 16 '19 14:04 aierui

和监听Server事件冲突了吧,是否有些多余

Yurunsoft avatar May 22 '19 04:05 Yurunsoft