PHP多线程编程之管道通信实例分析


Posted in PHP onMarch 07, 2015

本文实例讲述了PHP多线程编程之管道通信用法。分享给大家供大家参考。具体分析如下:

一个线程如果是个人英雄主义,那么多线程就是集体主义,你不再是一个独行侠,而是一个指挥家。

管道通信:
1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西。写就是
在队列末尾添加,读就是在队头删除。
 
2. 管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了。
 
3. 默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完。而读取线程也会被阻止,
   直到有进程向管道写入数据。当然,你可以改变这样的默认属性,用stream_set_block  函数,设置成非阻断模式。
 
下面是我分装的一个管道的类(这个类命名有问题,没有统一,没有时间改成统一的了,我一般先写测试代码,最后分装,所以命名上可能不统一):

<?php
class Pipe
{
  public $fifoPath;
  private $w_pipe;
  private $r_pipe;
 
  /**
   * 自动创建一个管道
   *
   * @param string $name 管道名字
   * @param int $mode 管道的权限,默认任何用户组可以读写
   */
  function __construct($name = 'pipe', $mode = 0666)
  {
    $fifoPath = "/tmp/$name." . posix_getpid();
    if (!file_exists($fifoPath)) {
      if (!posix_mkfifo($fifoPath, $mode)) {
        error("create new pipe ($name) error.");
        return false;
      }
    } else {
      error( "pipe ($name) has exit.");
      return false;
    }
    $this->fifoPath = $fifoPath;
  }
///////////////////////////////////////////////////
// 写管道函数开始
///////////////////////////////////////////////////
  function open_write()
  {
    $this->w_pipe = fopen($this->fifoPath, 'w');
    if ($this->w_pipe == NULL) {
      error("open pipe {$this->fifoPath} for write error.");
      return false;
    }
    return true;
  }
 
  function write($data)
  {
    return fwrite($this->w_pipe, $data);
  }
 
  function write_all($data)
  {
    $w_pipe = fopen($this->fifoPath, 'w');
    fwrite($w_pipe, $data);
    fclose($w_pipe);
  }
 
  function close_write()
  {
    return fclose($this->w_pipe);
  }
/////////////////////////////////////////////////////////
/// 读管道相关函数开始
////////////////////////////////////////////////////////
  function open_read()
  {
    $this->r_pipe = fopen($this->fifoPath, 'r');
    if ($this->r_pipe == NULL) {
      error("open pipe {$this->fifoPath} for read error.");
      return false;
    }
    return true;
  }
  function read($byte = 1024)
  {
    return fread($this->r_pipe, $byte);
  }
  function read_all()
  {
    $r_pipe = fopen($this->fifoPath, 'r');
    $data = '';
    while (!feof($r_pipe)) {
      //echo "read one K\n";
      $data .= fread($r_pipe, 1024);
    }
    fclose($r_pipe);
    return $data;
  }
  function close_read()
  {
    return fclose($this->r_pipe);
  }
  /**
   * 删除管道
   *
   * @return boolean is success
   */
  function rm_pipe()
  {
    return unlink($this->fifoPath);
  }
}
?>
 /*
有了这个类,就可以实现简单的管道通信了。*/

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php Calender(日历)代码分享
Jan 03 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
php 自定义错误日志实例详解
Nov 12 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
PHP crc32()函数讲解
Feb 14 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
PHP查询快递信息的方法
Mar 07 #PHP
php实现汉字验证码和算式验证码的方法
Mar 07 #PHP
php实现俄罗斯乘法实例
Mar 07 #PHP
php实现发送微信模板消息的方法
Mar 07 #PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
Mar 07 #PHP
PHP多文件上传类实例
Mar 07 #PHP
PHP实现阳历到农历转换的类实例
Mar 07 #PHP
You might like
中东人咖啡哲学
2021/03/03 咖啡文化
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
Jquery之Bind方法参数传递与接收的三种方法
2014/06/24 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python实现计算器功能
2019/10/31 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
在django中自定义字段Field详解
2019/12/03 Python
python Tensor和Array对比分析
2020/01/08 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
高中生学习的自我评价
2013/12/14 职场文书
茶叶生产计划书
2014/01/10 职场文书
元旦晚会策划方案
2014/02/18 职场文书
美术教学感言
2014/02/22 职场文书
三项教育活动实施方案
2014/03/30 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
十七岁的单车观后感
2015/06/12 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
幼儿园小班班务总结
2015/08/03 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
高中生物教学反思
2016/02/20 职场文书