Server->addProcess

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

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进程会重新创建一个

示例程序

$server = new Swoole\Server('127.0.0.1', 9501);

/**
 * 用户进程实现了广播功能,循环接收管道消息,并发给服务器的所有连接
 */
$process = new Swoole\Process(function($process) use ($server) {
    while (true) {
        $msg = $process->read();
        foreach($server->connections as $conn) {
            $server->send($conn, $msg);
        }
    }
});

$server->addProcess($process);

$server->on('receive', function ($serv, $fd, $reactor_id, $data) use ($process) {
    //群发收到的消息
    $process->write($data);
});

$server->start();


  • peng

    WARN swServer_get_worker: worker_id is exceed serv->worker_num + SwooleG.task_worker_num

  • 1234

    那位友友优雅地附上linux下的进程截图啊 看看这两个进程

  • Fang茨

    worker/task 如何接收process发送而来的消息?

  • 罗大发冲上云霄

    子进程会托管到Manager进程,如果发生致命错误,manager进程会重新创建一个。和worker进程和task进程一样,即使是没有正常执行完子进程后,manager也会重新创建。

  • 城

    请问如果不群发应该如何实现呢?这些回调函数真心不好看懂。。。。

  • KING

    这个while进入死循环了,还能出来吗?

  • 混乱的sw

    不知道这是一个什么鬼,大家去学c吧,c比这个简单

  • 混乱的sw

    场景需求更多的是这样的,我们需要swoole的服务器提供api接口服务,通过不同api接口实现不同的业务,比如有的接口需要用到子进程去执行子进程的process->exec();而不是服务一开启就把所有子进程扔进服务里,谁访问都去运行一下,如果这样,这个东西有什么用?可能我不会玩,但是真的觉得这个玩具不人性,没有基于应用的角度

  • Rachin

    @混乱的sw,你可以选择不调用$process的方法,就在worker或者task进程等里面处理业务,当需要(你设定的条件满足后)的时候再调用$process提供的方法写入到自定义进程不就行了,我是这样子理解的哈.