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

目录
相关文章
|
10天前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
|
15天前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
15天前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
1月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
20 0
|
2月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
312 4
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
2月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
3月前
|
消息中间件 Linux 开发者
Linux进程间通信秘籍:管道、消息队列、信号量,一文让你彻底解锁!
【8月更文挑战第25天】本文概述了Linux系统中常用的五种进程间通信(IPC)模式:管道、消息队列、信号量、共享内存与套接字。通过示例代码展示了每种模式的应用场景。了解这些IPC机制及其特点有助于开发者根据具体需求选择合适的通信方式,促进多进程间的高效协作。
161 3
|
3月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
67 0