(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即可测试到效果
<?PHP $a=0.5*100; if(is_int($a)){ echo'int'; } else{ echo'not int'; } ...
(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10 (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...
<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
在调用微信code换openid的接口curl报错curl Received HTTP code 403 from proxy after CONNECT,错误码56。可以看到是curl的代理有问题。然后我自己电脑设置代理去访问curl请求的地址,的确也返回了403,说明代理不允许访问这个地址,联系...