当前位置:首页 > PHP > 正文内容

php管道通信

高老师6年前 (2020-02-15)PHP4179

(1).管道是干嘛的?

管道是用于进程之间通信的,传播或交换信息

(2).管道有几种?

(2.1).匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。通常是指父子进程关系。

(2.2).高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。

(2.3).命名管道 (named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

(3).php支持哪种管道?

php仅支持命名管道,我猜测应该支持高级管道,待考证

(4).命名管道是怎么通信的?

通过文件的读写操作来实现管道文件的读写,也就是进程之间通过读写文件互相通知的,数据只能单向流动。当没有数据可读时,read操作将阻塞,一直阻塞到有数据;管道写入以后,write就会被阻塞,一直阻塞到数据被read.

(5).测试命名管道.创建读的进程read.php

<?php
//创建通信文件
$pipeFile = './test.pipe';
if (!file_exists($pipeFile))
{
    if (!posix_mkfifo($pipeFile, 0666))
    {
        exit('create pipe error.' . PHP_EOL);
    }
}
//打开通信文件
$file = fopen($pipeFile, 'r');
$content = fread($file, 1024);
var_dump($content);

(6).测试命名管道.创建写的进程write.php

<?php
//创建通信文件
$pipeFile = './test.pipe';
if (!file_exists($pipeFile))
{
    if (!posix_mkfifo($pipeFile, 0666))
    {
        exit('create pipe error.' . PHP_EOL);
    }
}
// 打开管道
$file = fopen($pipeFile, 'w');
// 写入管道
fwrite($file, 'How are you?');

(7).概念1:进程通信,最基础的条件是必须两人同时在线.

无论我们是单独执行write.php还是read.php,均会被阻塞,具体阻塞在fopen时,例如在执行到fopen($pipeFile, 'w')的时候会检查有没有其他进程在读这个文件,没有读的进程写了给谁看?直到有读这个文件的进程出现才不阻塞继续执行。读和写的进程是同时在线的。

(8).概念2:管道一般有大小,默认一般是4K

4K=4096字节,创建write.php

<?php
//创建通信文件
$pipeFile = './test.pipe';
// 打开管道
$file = fopen($pipeFile, 'w');
// 写入管道
$text = str_repeat('.', 4095);
$text .= 'g';
fwrite($file, $text);

我们先拼接4095个字节,最后1位补个字母g,测试可以读取到.如果我们的发送的数据超过4096B则超出部分无法写入。

当然4k的值大小由内核决定,通过ulimit -a指令我可以看到我的ubuntu的ipe size:(512 bytes, -p) 8,等于8*512=4096

(9).概念3:当读的进程将文件描述符关闭,会给写的进程发送一个SIGPIPE信号

write.php:

<?php
//开启异步信号处理(php7.1支持异步)
pcntl_async_signals(true);
//安装信号管理
pcntl_signal(SIGPIPE, function () {
    echo ('读的进程将文件句柄销毁了') . PHP_EOL;
});
// 打开管道
$file = fopen($pipeFile, 'w');
// 写入管道
fwrite($file, 'Hi girl');

read.php:

<?php
//创建通信文件
$pipeFile = './test.pipe';
//打开通信文件
$file = fopen($pipeFile, 'r');
fclose($file);

先执行write.php再执行read.php即可测试到效果

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/123.html

分享给朋友:

“php管道通信” 的相关文章

 php文件锁解决高并发

php文件锁解决高并发

前面的文章对于高并发下单商品导致商品库存为负值的问题请先阅读再阅读本篇文章一定对您有帮助,建议亲手测试较好。加上文件锁后的下单处理代码:【一】.阻塞模式:(如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行)<?php //连接数据库 $con=mysqli_connect(...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...

pcntl_signal(): Error assigning signal

pcntl_signal(): Error assigning signal

当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () {     posix_kill(0, SIGTERM); });...

PHP Warning:  ftok(): Project identifier is invalid

PHP Warning: ftok(): Project identifier is invalid

在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning:  ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....

php jsonp转json,php jsonp转数组,php jsonp转对象

php jsonp转json,php jsonp转数组,php jsonp转对象

将jsonp转为PHP数组和对象。/**  * jsonp转数组|Jsonp转json  * @param string $jsonp jsonp字符串  * @param bool $as...

thinkphp3定时任务,tp定时任务,thinkphp定时任务

thinkphp3定时任务,tp定时任务,thinkphp定时任务

本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。1.在tp3.2.3根目录下安装easytaskcomposer&...