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 中的4种标记风格介绍
May 10 PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 PHP
PHP数组操作类实例
Jul 11 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PDO::exec讲解
Jan 28 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 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 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
深入PHP变量存储的详解
2013/06/13 PHP
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
JS实现滑动插件
2020/01/15 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python专用方法与迭代机制实例分析
2014/09/15 Python
Python简单进程锁代码实例
2015/04/27 Python
pycharm远程调试openstack代码
2017/11/21 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
Python __slots__的使用方法
2020/11/15 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
物业管理求职自荐信
2013/09/25 职场文书
国窖1573广告词
2014/03/21 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
先进员工事迹材料
2014/12/20 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
Go 语言中 20 个占位符的整理
2021/10/16 Golang
ant design charts 获取后端接口数据展示
2022/05/25 Javascript