workerman源码理解

1.  workerman 运行流程 ?

或 master进程, worker进程, worker对象, 一些 tcpConnection对象, 监听socket, 客户端与服务端连接 socket,  协议解析$parser 这几者的关系?

从启动流程来说:

从接受连接来说, (已连接)从接收数据来说:

以tcp 处理为例子:

master进程 fork出来一些数量worker进程;

每一个worker进程有一个对应的worker对象;

worker对象 中执行 run方法, run方法里 有个 while(1);

这个死循环主要做的事情: 

        查看 监听socket,连接socket 是否有 读,写,异常事件发生。

        如果是 读事件发生了,

                则 如果 监听socket ,则执行acceptConnection回调,这个回调里面是:获取连接socket, 创建tcpConnection对象, 并把连接socket放到 read, write ,expection 的数组中。

                如果 是连接socket的读事件,则执行baseRead回调。baseRead回调里,把读到的数据放到baseRead关联的对象($this) 的 _recvBuffer属性上。

$buffer = \fread($socket, self::READ_BUFFER_SIZE);   //一次阅读 最多读取  65535个字节

     每一个连接socket 都对应一个 tcpConnection对象;

2. 什么情况下需要 停止从 连接socket对应的 接收数据缓冲区 暂停读取数据操作? 如何操作?

tcpConnection对象 有个 $maxSendBufferSize 属性,默认值 1048576, 即 1024* 1024 ,即 1M

也就是 应用程序的 发送缓冲区($this->_sendBuffer)的长度 大于1M时,说明请求太多,处理不过来,不再从连接socket的接收缓冲区中 fread数据了。

    /**
     * Sets the maximum send buffer size for the current connection.
     * OnBufferFull callback will be emited When the send buffer is full.
     *
     * @var int
     */
    public $maxSendBufferSize = 1048576;

如何操作:

    /**
     * Pauses the reading of data. That is onMessage will not be emitted. Useful to throttle back an upload.
     *
     * @return void
     */
    public function pauseRecv()
    {
        Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ);
        $this->_isPaused = true;
    }

3. 平滑停止(graceful stop)如何实现?

平滑停止逻辑:

子进程:  不断地收到 SIGTERM 信号:     1. 首先关闭 监听套接字socket的 监听, 2, 等待当前 worker进程 的连接数 变为0 时就可以 tcpConnection destroy了

master进程:收到SIGTERM信号后,向4个worker进程发送SIGTERM信号:\posix_kill($worker_pid, $sig);

业务层面的现象就是 ,建立过连接的 请求 还能继续访问,还没建立连接的 请求,发起访问就访问不通了(三次握手没有创建成功)

实验验证:

启动workerman 提供的http服务

浏览器访问:

 查看服务的连接情况

说明:不停刷新浏览器,可以看到建立了2条连接。 

4. tcpConnection send 方法/发送数据

对将要发送的数据encode 处理

如果应用层协议上的发送缓冲区(tcpConnection的_sendBuffer属性) 为空,就尝试直接发送数据到 连接socket的 发送缓冲区。

        $len = @\fwrite($this->_socket, $send_buffer);

                如果发送成功:                 

                if ($len === \strlen($send_buffer)) {
                    $this->bytesWritten += $len;
                    return true;
                }

                如果只发送了一部分数据:             

                $this->_sendBuffer = \substr($send_buffer, $len);
                $this->bytesWritten += $len;

                             ......

                                Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite'));

99. 用到的php函数

pcntl_signal_dispatch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值