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);