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 相关文章推荐
URL Rewrite的设置方法
Jan 02 PHP
php的access操作类
Apr 09 PHP
jQuery 源码分析笔记
May 25 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
windows下安装php的memcache模块的方法
Apr 07 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP实现的mysql读写分离操作示例
May 22 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
Laravel 错误提示本地化的实现
Oct 22 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 UTF8中文字符截断函数代码
2012/09/11 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
2013/04/13 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
一篇.NET面试题
2014/09/29 面试题
企业治理工作自我评价
2013/09/26 职场文书
班组长的岗位职责
2013/12/09 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
应届生简历自我评价
2015/03/11 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
redis 解决库存并发问题实现数量控制
2022/04/08 Redis