PHP 进程通信-管道

作者: 会长__ | 来源:发表于2019-01-16 19:06 被阅读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

相关文章

  • PHP 进程通信-管道

    1.简介 管道是*NIX上常见的一个东西,大家平时使用linux的时候也都在用,简单理解就是|,比如ps -aux...

  • Linux 进程间通信

    进程间通信 一 进程间通信 -- 管道 mkfifo test 创建管道文件 匿名管道和命名管道:匿名管道:匿名管...

  • 零散的小知识记录(待补充和修改)

    Android跨进程通信:Binder,socket/管道/消息队列,共享内存; linux进程间通信:管道,Bi...

  • PHP进程间通信--有名管道

    管道PIPE 管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程...

  • Swoole Process

    简介 基于C语言封装的进程管理模块,方便php的多进程编程 内置管道、消息队列接口,可方便实现进程间通信 自定义信号管理

  • Linux-C-day-2-进程通过--管道通信

    管道通信 进程间管道通信方式可以通过man 7 pipe来查看; 匿名管道 单工管道 打开管道:使用popen()...

  • 20.2、python进程间通信——队列和管道

    进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe) 进程间通信 ...

  • Linux进程间通信

    Linux进程间通信的概念 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named p...

  • Linux系统编程:Inter-Process Communic

    一、IPC——进程间通信 Linux系统提供的进程间通信的手段: 消息传递类:信号 匿名管道 命名管道 socke...

  • 进程之间和线程之间的通信

    进程之间的通信 管道:管道是一种半双工的通信方式,各个进程互斥访问管道,数据也只能单向流动,但是可以通过两个管道来...

网友评论

    本文标题:PHP 进程通信-管道

    本文链接:https://www.haomeiwen.com/subject/foqvdqtx.html