php进程通信-PIPE管道通信

简介: php进程通信-PIPE管道通信

上一篇文章讲到了php进程通信的进程信号通信方法,本文介绍的是有名管道:

管道通信,主要是利用文件,写入以及读取来进行通信的,

通俗来讲,就是A进程在1.txt写入1,B进程读取1.txt,就能读取到这个1,这样就通信成功了.

当然,php进程管道通信没有这么简单

注意:多进程系列文章,都建立在linux环境,php-cli运行模式下

一:创建个专属管道的文件:

 $fifoPath"tmp/$name".getmypid() ;//定义文件名

        if(!file_exists($fifoPath)) {

            if(!posix_mkfifo($fifoPath, 0666)) {//posix函数,创建一个特殊的pipe文件

//                error("create new pipe ($name) error.");

                returnfalse;

            }

        else{

//            error("pipe ($name) has exit.");

            returnfalse;

        }

二:读取数据

$r_pipefopen($fifoPath'r');//正常读取文件

if($r_pipe== NULL) {

    returnfalse;

}

 

$datafread($r_pipe, 1024);

三:写入数据

$w_pipefopen($fifoPath'w');//正常操作文件一样打开该管道

if($w_pipe== NULL) {

    thrownewException('打开管道错误!');

}

 

$result= fwrite($w_pipe$data);//写入文件一样写入数据

四:删除管道

unlink($tfifoPath);//删除文件

五:封装类

<?php

 

/**

 * Created by PhpStorm.

 * User: tioncico

 * Date: 18-5-21

 * Time: 下午11:51

 */

classPipe

{

    public$fifoPath;

    private$w_pipe;

    private$r_pipe;

 

    /**

     * 自动创建一个管道

     *

     * @param string $name 管道名字

     * @param int $mode 管道的权限,默认任何用户组可以读写

     */

    function__construct($name'pipe'$mode= 0666)

    {

        $fifoPath"tmp/$name".getmypid() ;

        if(!file_exists($fifoPath)) {

            if(!posix_mkfifo($fifoPath$mode)) {

//                error("create new pipe ($name) error.");

                returnfalse;

            }

        else{

//            error("pipe ($name) has exit.");

            returnfalse;

        }

        $this->fifoPath = $fifoPath;

    }

 

///////////////////////////////////////////////////

//  写管道函数开始

///////////////////////////////////////////////////

    functionopen_write()

    {

        $this->w_pipe = fopen($this->fifoPath, 'w');

//        var_dump($this->w_pipe);

        if($this->w_pipe == NULL) {

            thrownewException('打开管道错误!');

//            return false;

        }

        returntrue;

    }

 

    functionwrite($data)

    {

        returnfwrite($this->w_pipe, $data);

    }

 

    functionwrite_all($data)

    {

        $w_pipefopen($this->fifoPath, 'w');

        fwrite($w_pipe$data);

        fclose($w_pipe);

    }

 

    functionclose_write()

    {

        returnfclose($this->w_pipe);

    }

/////////////////////////////////////////////////////////

/// 读管道相关函数开始

////////////////////////////////////////////////////////

    functionopen_read()

    {

        $this->r_pipe = fopen($this->fifoPath, 'r');

        if($this->r_pipe == NULL) {

//            error("open pipe {$this->fifoPath} for read error.");

            returnfalse;

        }

        returntrue;

    }

 

    functionread($byte= 1024)

    {

        returnfread($this->r_pipe, $byte);

    }

 

    functionread_all()

    {

        $r_pipefopen($this->fifoPath, 'r');

        $data   '';

        while(!feof($r_pipe)) {

            //echo "read one K\n";

            $data.= fread($r_pipe, 1024);

        }

        fclose($r_pipe);

        return$data;

    }

 

    functionclose_read()

    {

        returnfclose($this->r_pipe);

    }

////////////////////////////////////////////////////

 

    /**

     * 删除管道

     *

     * @return boolean is success

     */

    functionrm_pipe()

    {

        returnunlink($this->fifoPath);

    }

}

六:注意事项

1:管道与普通文件有一点非常不同的就是:管道需要先有个进程读取进程,才可以写入,否则按写入模式打开文件时阻塞,以下是测试截图:

image.png

image.png

目录
相关文章
|
1天前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
1天前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
21小时前
|
Linux C语言
【C语言】进程间通信之命名管道fifo
【C语言】进程间通信之命名管道fifo
7 0
|
21小时前
|
C语言
【C语言】进程间通信之管道pipe
【C语言】进程间通信之管道pipe
8 0
|
17天前
|
Python
Python IPC深度探索:解锁跨进程通信的无限可能,以管道与队列为翼,让你的应用跨越边界,无缝协作,震撼登场
【8月更文挑战第3天】Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
13 0
|
19天前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
在操作系统中,进程间通信(IPC)是至关重要的,它提供了多种机制来实现不同进程间的数据交换和同步。本篇文章将详细介绍几种常见的IPC方式,包括管道、信号、消息队列、共享内存、信号量和套接字,帮助你深入理解并合理应用这些通信方式,提高系统性能与可靠性。
39 0
|
1月前
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
|
1月前
|
Unix Linux Python
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
`subprocess`模块是Python中用于生成新进程、连接到它们的输入/输出/错误管道,并获取它们的返回(退出)代码的模块。
|
1月前
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
|
1月前
|
安全 Linux 数据格式
【Linux】进程通信----管道通信(下)
【Linux】进程通信----管道通信(下)
21 0