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实现文件安全下载
Oct 09 PHP
NT IIS下用ODBC连接数据库
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
php的access操作类
Apr 09 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
PHP三层结构(上) 简单三层结构
Jul 04 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
php5与php7的区别点总结
Oct 11 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
PHP中比较时间大小实例
2014/08/21 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
javascript 面向对象实战思想分享
2017/09/07 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python字符串拼接的几种方法整理
2017/08/02 Python
Django框架自定义session处理操作示例
2019/05/27 Python
Python语言进阶知识点总结
2019/05/28 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
Python 没有main函数的原因
2020/07/10 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
python推导式的使用方法实例
2021/02/28 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
校园自助餐厅的创业计划书
2013/12/26 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
购房协议书
2014/04/11 职场文书
认购协议书范本
2014/04/22 职场文书
博士生专家推荐信
2014/09/26 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
利用Python实现模拟登录知乎
2022/05/25 Python