Process->read

从管道中读取数据。

function Process->read(int $buffer_size=8192) : string | bool;
  • $buffer_size是缓冲区的大小,默认为8192,最大不超过64K
  • 管道类型为DGRAM数据报时,read可以读取完整的一个数据包
  • 管道类型为STREAM时,read是流式的,需要自行处理包完整性问题
  • 读取成功返回二进制数据字符串,读取失败返回false

这里是同步阻塞读取的,可以使用swoole_event_add将管道加入到事件循环中,变为异步模式

示例:

function callback_function_async(swoole_process $worker)
{
    $GLOBALS['worker'] = $worker;
    swoole_event_add($worker->pipe, function($pipe) {
        $worker = $GLOBALS['worker'];
        $recv = $worker->read();

        echo "From Master: $recv\n";

        //send data to master
        $worker->write("hello master\n");

        sleep(2);

        $worker->exit(0);
    });
}

注意事项

由于Swoole底层使用了epollLT模式,因此swoole_event_add添加的事件监听,在事件发生后回调函数中必须调用read方法读取socket中的数据,否则底层会持续触发事件回调。



  • 江震阳

    swoole_event_add 有什么用?第一个参数是必须要写什么类型
    

  • 王嘉琪-晨游科技

    用来设置回调,就不会一直阻塞在那里。第一个参数是文件标识符

  • 俞旻康

    为什么一定要 $worker->exit(0);主进程才会收到他的消息 。。