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

目录
相关文章
|
缓存 前端开发 JavaScript
深入了解 Vite:快速、简洁、高效的前端构建工具(上)
深入了解 Vite:快速、简洁、高效的前端构建工具(上)
|
网络协议 IDE PHP
Swoole如何使用Xdebug进行初步调试
在 PHP-FPM 中使用 Xdebug 的人应该不少,而在 Swoole 中使用 Xdebug 的人还是很少的,原因是 Swoole 扩展明确说明了和 Xdebug 扩展冲突 不过好在提供了一个 Sdebug 进行了兼容,让 Xdebug 可用于 Swoole 环境进行断点、调试
1105 0
Swoole如何使用Xdebug进行初步调试
|
11月前
|
IDE PHP 开发工具
【PHP开发专栏】Xdebug在PHP调试中的应用
Xdebug 是一个功能强大的 PHP 扩展,提供调试、代码分析和性能分析等功能。本文介绍了 Xdebug 的基本概念、安装配置方法及在 PHP 调试中的应用技巧,包括断点调试、堆栈跟踪、远程调试和性能分析等。通过合理使用 Xdebug,可以显著提高调试效率和代码质量。
259 3
|
JavaScript 数据处理
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
|
安全 编译器 PHP
PHP现代化之旅:深入理解PHP 8的新特性与最佳实践
本文将引导读者踏上一段探索PHP最新版本—PHP 8的旅程。我们将通过权威数据和研究,深入剖析PHP 8引入的关键新特性及其对开发实践的影响。文章旨在揭示这些更新如何优化性能、提升代码可读性与维护性,并探讨它们在现代Web开发中的应用。通过对JIT编译器的讨论、语言构造改进的分析以及新语法糖的评估,我们将展现PHP 8如何为开发者提供更高效、更安全的编程体验。最后,结合案例研究和开发者反馈,我们将提出一系列针对PHP 8的最佳实践建议,帮助开发者充分利用这一强大版本的特性。
174 31
|
存储 关系型数据库 MySQL
SQLite的应用场景有哪些?
【8月更文挑战第21天】SQLite的应用场景有哪些?
714 3
|
监控 安全 Linux
在Linux中,如何查看和审计系统日志文件以检测异常活动?
在Linux中,如何查看和审计系统日志文件以检测异常活动?
|
Kubernetes 负载均衡 网络协议
在K8S中,headless服务是什么?
在K8S中,headless服务是什么?
|
存储 Ubuntu 关系型数据库
如何和何时使用 Sqlite
如何和何时使用 Sqlite
154 0