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 相关文章推荐
基于文本的搜索
Oct 09 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
PHP实现随机数字、字母的验证码功能
Aug 01 PHP
Laravel实现ORM带条件搜索分页
Oct 24 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 咖啡文化
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
大学生职业生涯规划书前言
2014/01/09 职场文书
政治表现评语
2014/05/04 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
会计专业自荐信范文
2015/03/05 职场文书
现实表现证明材料
2015/06/19 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
vue 实现上传组件
2021/05/31 Vue.js
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Hive HQL支持2种查询语句风格
2022/06/25 数据库