- 管道是比较常用的多进程通信手段,
- 管道分为无名管道与有名管道,
- 无名管道只能用于具有亲缘关系的进程间通信,
- 而有名管道可以用于同一主机上任意进程。这里只介绍有名管道
- 管道可以认为是一个单向的队列,不同的线程都可以往里面写东西,也都可以从里面读东西。写就是在队列末尾添加,读就是在队头删除。
- 管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了。
- 默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完。而读取进程也会被阻止, 直到有进程向管道写入数据。当然,你可以改变这样的默认属性,用stream_set_block 函数,设置成非阻断模式。
上代码
<?php
//创建管道,注意路径的读写权限
$pipe_path = '/home/pipe/test.pipe';
if(!file_exists($pipe_path)){
if(!posix_mkfifo($pipe_path,0664)){
exit("创建管道失败");
}
}
$pid = pcntl_fork();
if($pid == 0){
// 子进程,向管道写数据
$file = fopen($pipe_path,'w');
$i = 0;
while ($i < 3){
$i++;
fwrite($file,"$i");
sleep(1);
}
exit('子进程退出');
}else{
// 父进程,从管道读数据
$file = fopen($pipe_path,'r');
while (true){
$rel = fread($file,1);
echo "{$rel}".PHP_EOL;
sleep(1);
}
}
查看效果