php管道通信

简介: php管道通信

(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即可测试到效果

目录
相关文章
|
10月前
|
存储 索引 Python
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
503 8
|
6月前
|
JSON 供应链 API
‌1688图片搜索API技术内幕:从特征提取到向量匹配的完整实现路径
1688图片搜索相似商品API基于计算机视觉技术,支持通过图片查找同款或相似商品,适用于电商选品与供应链管理。API采用RESTful设计,支持JPG/PNG格式,返回含商品ID、标题、价格、销量等JSON数据,提供Python调用示例。前往体验:c0b.cc/R4rbK2
|
机器学习/深度学习 人工智能 自然语言处理
《解锁ArkTS模型封装与抽象:代码复用与维护的进阶之道》
在鸿蒙系统中使用ArkTS开发时,高效管理和运用AI模型至关重要。通过封装和抽象,隐藏模型实现细节并提供简洁接口,能提升代码复用性、稳定性和可扩展性。封装使模型内部变化不影响外部调用,降低耦合度;抽象提取共性操作,简化代码结构。这不仅提高开发效率,还增强代码可维护性和团队协作效率,为复杂智能应用奠定基础。
310 21
|
存储 安全 前端开发
session超时详解
session超时详解
|
JavaScript 数据处理
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
|
存储 传感器
Landsat遥感影像数据的批量下载:USGS
本文介绍在USGS网站批量下载Landsat系列遥感影像的方法~
1383 1
Landsat遥感影像数据的批量下载:USGS
|
JavaScript 前端开发 索引
JS 删除数组元素( 5种方法 )
JS 删除数组元素( 5种方法 )
1332 1
|
消息中间件 网络协议 安全
C# 一分钟浅谈:WebSocket 协议应用
【10月更文挑战第6天】在过去的一年中,我参与了一个基于 WebSocket 的实时通信系统项目,该项目不仅提升了工作效率,还改善了用户体验。本文将分享在 C# 中应用 WebSocket 协议的经验和心得,包括基础概念、C# 实现示例、常见问题及解决方案等内容,希望能为广大开发者提供参考。
1222 0
|
搜索推荐 算法 PHP
详尽分享记6种php加密解密方法
详尽分享记6种php加密解密方法
1083 0
|
运维 监控 Java
35-JVM性能优化总结-JVM性能优化到底该怎么做?
通过之前大量的案例和工具的介绍,相信大家对于JVM优化有了一定的了解和熟悉,接下来我们将整个JVM性能优化的步骤做一个总结。
450 0

热门文章

最新文章