服务启动事件

  1. function onWorkerStart(\swoole_server $server,$workerId);

此事件在Worker进程/Task进程启动时发生。这里创建的对象可以在进程生命周期内使用,需要注意的是

  • Task进程也会触发此事件
  • 发生致命错误或者代码中主动调用exit时,Worker/Task进程会退出,管理进程会重新创建新的进程,也会触发本事件
  • onWorkerStart/onStart是并发执行的,没有先后顺序
  • 事件回调带有$server参数,可以通过$server->taskworker来判断当前是Worker进程还是Task进程

注意: $workerId是一个从0-$worker_num之间的数字,表示这个Worker进程的ID,$workerId和进程PID没有任何关系

可以在此事件中将自定义的逻辑添加到EventLoop以及向Task投递任务

下面的示例利用inotify拓展实现当文件被修改时,自动Reload服务

  1. //请确定有inotify拓展
  2. if ($workerId == 0) {
  3. // 递归获取所有目录和文件
  4. $a = function ($dir) use (&$a) {
  5. $data = array();
  6. if (is_dir($dir)) {
  7. //是目录的话,先增当前目录进去
  8. $data[] = $dir;
  9. $files = array_diff(scandir($dir), array('.', '..'));
  10. foreach ($files as $file) {
  11. $data = array_merge($data, $a($dir . "/" . $file));
  12. }
  13. } else {
  14. $data[] = $dir;
  15. }
  16. return $data;
  17. };
  18. $list = $a(ROOT . "/App");
  19. $notify = inotify_init();
  20. // 为所有目录和文件添加inotify监视
  21. foreach ($list as $item) {
  22. inotify_add_watch($notify, $item, IN_CREATE | IN_DELETE | IN_MODIFY);
  23. }
  24. // 加入EventLoop
  25. swoole_event_add($notify, function () use ($notify) {
  26. $events = inotify_read($notify);
  27. if (!empty($events)) {
  28. //注意更新多个文件的间隔时间处理,防止一次更新了10个文件,重启了10次,懒得做了,反正原理在这里
  29. Server::getInstance()->getServer()->reload();
  30. }
  31. });
  32. }