管道用于存储进程之间的通信数据, 为了方便理解, 可以把管道比作文件, 进程A将数据写到管道中, 进程B从管道中读取数据.
管道分为两种: 匿名管道pipe和命名管道fifo.
匿名管道只能父子进程之间通信, 命名管道支持任何两个进程之间通信.
posix_mkfifo ( string $pathname , int $mode ) : bool
创建一个命名管道fifo
代码:
<?php
$pipe = './test.pipe';
if (!file_exists($pipe)) {
if (!posix_mkfifo($pipe, 0666)) {
exit('创建命名管道失败' . PHP_EOL);
}
}
// 创建子进程, 子进程写管道, 父进程读管道
$pid = pcntl_fork();
switch ($pid) {
case -1:
die('fork failed');
break;
case 0:
$file = fopen($pipe, 'w');
fwrite($file, 'hello world' );
sleep(3);
exit;
break;
default:
$file = fopen($pipe, 'r');
// 父进程阻塞, 直到子进程退出
echo fread($file, 20) . PHP_EOL;
// 父进程阻塞, 直到子进程退出
pcntl_wait($status);
break;
}
运行结果:
[root@e2963c647c8b www]# php fifo.php
hello world