php Swoole父子进程通信

2021-10-02

SOCK_STREAM类型通信

默认类型,需要处理TCP数据包边界问题

use Swoole\Process;
use function Swoole\Coroutine\run;

$proc1 = new Process(function (Process $proc) {
    $socket = $proc->exportSocket();
    echo $socket->recv();
    // 发送消息
    $socket->send("hello master\n");
    echo "proc1 stop\n";
}, false, 1, true);//构造函数pipe type传为2即SOCK_STREAM

$proc1->start();

//父进程创建一个协程容器
run(function() use ($proc1) {
    $socket = $proc1->exportSocket();
    $socket->send("hello pro1\n");
    // 接收消息
    var_dump($socket->recv());
});
Process::wait(true);

SOCK_DGRAM类型通信

不需要考虑 TCP 数据包边界问题,发送多大的数据接收的时候就收到多大的数据,没有传输过程中的丢包、乱序问题,send写入和recv读取的顺序是完全一致的。send返回成功后一定是可以 recv到;但是单次发送数据不能大于64k,收包速度太慢操作系统缓冲区满了会丢弃包,可以适当调大缓冲区

use Swoole\Process;
use function Swoole\Coroutine\run;

$proc1 = new Process(function (Process $proc) {
    $socket = $proc->exportSocket();
    while (1) {
        var_dump($socket->send("hello master\n"));
    }
    echo "proc1 stop\n";
}, false, 2, 1);//构造函数pipe type传为2即SOCK_DGRAM

$proc1->start();

run(function() use ($proc1) {
    $socket = $proc1->exportSocket();
    var_dump(strlen($socket->recv()));//一次recv只会收到一个"hello master\n"字符串 不会出现多个"hello master\n"字符串
});

Process::wait(true);

 

{/if}