Server->addProcess

添加一个用户自定义的工作进程。此函数通常用于创建一个特殊的工作进程,用于监控、上报或者其他特殊的任务。

  1. bool Server->addProcess(Process $process);

此函数在1.7.9以上版本可用

参数

  • $processProcess对象,注意不需要执行start。在Server启动时会自动创建进程,并执行指定的子进程函数
  • 创建的子进程可以调用$server对象提供的各个方法,如getClientList/getClientInfo/stats
  • Worker/Task进程中可以调用$process提供的方法与子进程进行通信
  • 在用户自定义进程中可以调用$server->sendMessageWorker/Task进程通信

返回值

添加成功返回true,失败返回false

注意事项

  • 用户进程内不能使用Server->task/taskwait接口
  • 用户进程内可以使用Server->send/close等接口
  • 用户进程内应当进行while(true)EventLoop循环,否则用户进程会不停地退出重启

生命周期

用户进程的生存周期与MasterManager是相同的,不会受到reload影响

  • 用户进程不受reload指令控制,reload时不会向用户进程发送任何信息
  • shutdown关闭服务器时,会向用户进程发送SIGTERM信号,关闭用户进程
  • 自定义进程会托管到Manager进程,如果发生致命错误,Manager进程会重新创建一个

示例程序

  1. $server = new Swoole\Server('127.0.0.1', 9501);
  2. /**
  3. * 用户进程实现了广播功能,循环接收管道消息,并发给服务器的所有连接
  4. */
  5. $process = new Swoole\Process(function($process) use ($server) {
  6. while (true) {
  7. $msg = $process->read();
  8. foreach($server->connections as $conn) {
  9. $server->send($conn, $msg);
  10. }
  11. }
  12. });
  13. $server->addProcess($process);
  14. $server->on('receive', function ($serv, $fd, $reactor_id, $data) use ($process) {
  15. //群发收到的消息
  16. $process->write($data);
  17. });
  18. $server->start();