集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 > PHP >

成都php开发培训讲解在什么场合里你会用到消息队列?

发布者: php开发培训     浏览次数:     发布时间:2018-08-06 10:51:13

成都php开发培训讲解:1. 什么是消息队列;2. 为什么使用消息队列;3. 什么场合使用消息队列;4. 什么时候使用消息队列;...

  成都php开发培训讲解在什么场合里你会用到消息队列?

  1. 什么是消息队列

  消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式

  2. 为什么使用消息队列

  消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读出。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

  3. 什么场合使用消息队列

  你首先需要弄清楚,消息队列与远程过程调用的区别,在很多读者咨询我的时候,我发现他们需要的是RPC(远程过程调用),而不是消息队列。

  消息队列有同步或异步实现方式,通常我们采用异步方式使用消息队列,远程过程调用多采用同步方式。

  MQ与RPC有什么不同? MQ通常传递无规则协议,这个协议由用户定义并且实现存储转发;而RPC通常是专用协议,调用过程返回结果。

  4. 什么时候使用消息队列

  同步需求,远程过程调用(PRC)更适合你。

  异步需求,消息队列更适合你。

  目前很多消息队列软件同时支持RPC功能,很多RPC系统也能异步调用。

  消息队列用来实现下列需求

  存储转发

  分布式事务

  发布订阅

  基于内容的路由

  点对点连接

  以下是一个消息队列的运用实例

  /**

  * Created by PhpStorm.

  * User: lin

  * Date: 2017/6/9

  * Time: 11:19

  * 实现php共享内存消息队列

  */

  class ShmQueue

  {

  private $maxQSize = 0;//队列最大长度

  private $front = 0;//队头指针

  private $rear = 0; //队尾指针

  private $blockSize = 256; // 块的大小(byte)

  private $memSize = 1280; // 最大共享内存(byte)

  private $shmId = 0;//根据这个id可以操作该共享内存片段

  private $filePtr = APP_PATH.'public/shmq.ptr';

  private $semId = 0;

  public function __construct()

  {

  $shmkey = ftok(__FILE__, 't');//产生系统id

  $this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize );//创建一个内存段

  $this->maxQSize = $this->memSize / $this->blockSize;

  // 申請一个信号量

  $this->semId = sem_get($shmkey, 1);

  sem_acquire($this->semId); // 申请进入临界

  $this->init();

  }

  private function init()

  {

  if ( file_exists($this->filePtr) ){

  $contents = file_get_contents($this->filePtr);

  $data = explode( '|', $contents );

  if ( isset($data[0]) && isset($data[1])){

  $this->front = (int)$data[0];

  $this->rear = (int)$data[1];

  }

  }

  }

  public function getLength()

  {

  return (($this->rear - $this->front + $this->memSize) % ($this->memSize) )/$this->blockSize;

  }

  public function enQueue( $value )

  {

  if ( $this->ptrInc($this->rear) == $this->front ){ // 队满

  return false;

  }

  //echo $this->front;

  $data = $this->encode($value);

  shmop_write($this->shmId, $data, $this->rear );

  $this->rear = $this->ptrInc($this->rear);

  return $this->decode($data);

  }

  public function deQueue()

  {

  if ( $this->front == $this->rear ){ // 队空

  throw new Exception(" block size is null!");

  }

  $value = shmop_read($this->shmId, $this->front, $this->blockSize-1);

  $this->front = $this->ptrInc($this->front);

  return $this->decode($value);

  }

  private function ptrInc( $ptr )

  {

  return ($ptr + $this->blockSize) % ($this->memSize);

  }

  private function encode( $value )

  {

  $data = serialize($value) . "__eof";

  //echo '';

  //echo strlen($data);

  //echo '';

  // echo $this->blockSize -1;

  // echo '';

  if ( strlen($data) > $this->blockSize -1 ){

  throw new Exception(strlen($data)." is overload block size!");

  }

  return $data;

  }

  public function exist($value){//判断队头的数据

  $data = shmop_read($this->shmId, $this->front, $this->blockSize-1);

  if($value == $this->decode($data)){

  return 1;

  }

  return 0;

  }

  private function decode( $value )

  {

  //return $value;

  $data = explode("__eof", $value);

  return unserialize($data[0]);

  }

  public function __destruct()

  {

  //保存队头和队尾指针

  $data = $this->front . '|' . $this->rear;

  file_put_contents($this->filePtr, $data);

  sem_release($this->semId); // 出临界区, 释放信号量

  }

  }

  如何调用

  $shmq = new ShmQueue();

  入队:

  $data = 125;

  $shmq->enQueue($data);

  出队:

  $shmq->deQueue();

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:绵阳市涪城区临园路东段68号富临大都会7栋3单元9层12号

联系电话:15023458194

公交路线:富乐路口凯德广场(10路;29路;3路;15路;11路;15a路;71路)

校区地址:成都市锦江区东大街紫东楼段35号明宇金融广场19楼1903室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街紫东段35号明宇广场2306

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市成华区建设路10号万科钻石广场B座5楼

联系电话:15023458194

公交路线:建设路中(6路;14路;42路;72路;76路;1010路;)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

20016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56