PHP经验分享PHP是世界上最好的语言PHP实战

PHP 进程通信-管道

2019-01-16  本文已影响2人  会长__

1.简介

管道是*NIX上常见的一个东西,大家平时使用linux的时候也都在用,简单理解就是|,比如ps -aux|grep php这就是管道,大概意思类似于ps进程和grep进程两个进程之间用|完成了通信。管道是一种半双工(现在也有系统已经支持全双工的管道)的工作方式,也就是说数据只能沿着管道的一个方向进行传递,不可以在同一个管道上反向传数据。管道分为两种,一种叫做未命名的管道,另一种叫做命名管道,未命名管道只能在拥有公共祖先的两个进程之间使用,简单理解就是只能用于父进程和和其子进程之间的通信,但是命名管道则可以用于任何两个毫无关连的进程之间的通信

管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西。写就是在队列末尾添加,读就是在队头删除。

管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了。

默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完。而读取进程也会被阻止, 直到有进程向管道写入数据。当然,你可以改变这样的默认属性,用stream_set_block 函数,设置成非阻断模式。

2.实现

有名管道

<?php
// 绝对路径
$pipe_file = __DIR__.DIRECTORY_SEPARATOR.'test.pipe';
// 文件是否存在
if( !file_exists( $pipe_file ) ){
    // 创建管道
    if( !posix_mkfifo( $pipe_file, 0666 ) ){
        exit( 'create pipe error.'.PHP_EOL );
    }
}
// fock进程
$pid = pcntl_fork();
if( $pid < 0 ){
    exit( 'fork error'.PHP_EOL );
} else if( 0 == $pid ) {
    // 打开管道
    $file = fopen( $pipe_file, "w" );
    // 写入管道
    fwrite( $file, "helo world." );
    exit;
} else if( $pid > 0 ) {
    $file = fopen( $pipe_file, "r" );
    // 读取管道
    $content = fread( $file, 1024 );
    echo $content.PHP_EOL;
    pcntl_wait( $status );
}

测试

image.png

3.参考资源

https://github.com/elarity/advanced-php/blob/master/8.%20php%E5%A4%9A%E8%BF%9B%E7%A8%8B%E5%88%9D%E6%8E%A2---%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%BA%8C%E4%B8%89%E4%BA%8B.md

https://www.cnblogs.com/niniwzw/archive/2010/01/20/1652801.html

上一篇 下一篇

猜你喜欢

热点阅读