🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Process->write [TOC] 向管道内写入数据。 ~~~ int Process->write(string $data); ~~~ * `$data`的长度在`Linux`系统下最大不超过`8K`,`MacOS/FreeBSD`下最大不超过`2K` * 在子进程内调用`write`,父进程可以调用`read`接收此数据 * 在父进程内调用`write`,子进程可以调用`read`接收此数据 `Swoole`底层使用`Unix Socket`实现通信,`Unix Socket`是内核实现的全内存通信,无任何IO消耗。在1进程write,1进程read,每次读写`1024`字节数据的测试中,`100`万次通信仅需`1.02`秒。 管道通信默认的方式是流式,`write`写入的数据在`read`可能会被底层合并。可以设置`swoole_process`构造函数的第三个参数为`2`改变为数据报式。 > MacOS/FreeBSD可以设置`net.local.dgram.maxdgram`内核参数修改最大长度 ## 异步模式 如果进程内使用了异步IO,比如`swoole_event_add`,进程内执行write操作将变为异步模式。swoole底层会监听可写事件,自动完成管道写入。 异步模式下如果SOCKET缓存区已满,Swoole的处理逻辑请参考[swoole\_event\_write](swoole\_event\_write.md) ## 同步模式 进程内未使用任何异步IO,当前管道为同步阻塞模式,如果缓存区已满,将阻塞等待直到write操作完成。 * Task进程就是同步阻塞的模式,如果管道的缓存区已满,调用`write`时会发生阻塞 ## 乱序丢包 很多网络文章提到`DGRAM`模式下会出现丢包、乱序问题,实际上这些问题仅存在于`Internet`网络的`UDP`通信。`UnixSocket`是Linux内核实现的内存数据队列,不会出现丢包乱序问题。`write`写入和`read`读取的顺序是完全一致的。`write`返回成功后一定是可以`read`到的。