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 set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
服务器web工具 php环境下
Dec 29 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
php学习笔记之 函数声明(二)
Jun 09 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
php简单压缩css样式示例
Sep 22 PHP
laravel5.4生成验证码的实例讲解
Aug 05 PHP
php workerman定时任务的实现代码
Dec 23 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
PHP rmdir()函数的用法总结
Jul 02 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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实现网上点歌(二)
2006/10/09 PHP
《APMServ 5.1.2》使用图解
2006/10/23 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php printf输出格式使用说明
2010/12/05 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python中remove函数的踩坑记录
2021/01/04 Python
PHP中如何创建和修改数组
2012/05/02 面试题
技校生自我鉴定
2013/12/08 职场文书
公司离职证明样本
2014/09/13 职场文书
2014公司年终工作总结
2014/12/19 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL