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 动态执行带有参数的类方法
Apr 10 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
VB中的RasEnumConnections函数返回632错误解决方法
Jul 29 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
PHP图片加水印实现方法
May 06 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
nodeJS微信分享
2017/12/20 NodeJs
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
javascript设计模式之装饰者模式
2020/01/30 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
详解python 爬取12306验证码
2019/05/10 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
python多维数组分位数的求取方式
2020/03/03 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
给排水工程师岗位职责
2013/11/21 职场文书
机关办公室岗位职责
2014/04/16 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
施工员岗位职责
2015/02/10 职场文书
聘任书范文大全
2015/09/21 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
java泛型通配符详解
2021/07/25 Java/Android