(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即可测试到效果
header() 函数向客户端发送原始的 HTTP 报头。(官方解释)通俗的讲header函数将参数中的字符串作为服务端的响应头来返回给客户端。什么是服务端的响应头?打开谷歌浏览器看看network中的请求response header信息即可。更多的参数百度response header即可浏览器...
先在centos安装openssl,然后开始://生成私钥openssl genrsa -out rsa_private_key.pem 1024//生成公钥openssl rsa -in rsa_private_key.pem&...
php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不...
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...