1。什么是消息队列?消息队列(英文:Messagequeue)是进程之间或同一进程的不同线程之间的一种通信方式。Queue消息队列技术是分布式应用程序之间交换信息的技术。消息队列可以驻留在内存中或磁盘上,并且队列存储消息直到它们被应用程序读取。使用消息队列,应用程序可以独立执行,而无需知道彼此的位置或在继续之前等待接收程序接收消息。3.什么时候使用消息队列,首先要搞清楚消息队列和远程过程调用的区别。很多读者咨询我的时候,我发现他们需要的是RPC(remoteprocedurecalls),而不是消息队列。消息队列可以同步或异步实现。通常,我们以异步方式使用消息队列,而远程过程调用大多使用同步方式。MQ与RPC有何不同?MQ通常传输一个不规则的协议,由用户定义并实现存储转发;而RPC通常是一个专用的协议,调用过程返回结果。4.当使用消息队列同步需求时,远程过程调用(PRC)更适合你。对于异步需求,消息队列更适合你。目前很多消息队列软件同时支持RPC功能,很多RPC系统也可以异步调用。消息队列用于实现以下需求存储转发分布式事务发布订阅基于内容的路由点对点连接以下是一个消息队列应用示例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();}privatefunctioninit(){if(file_exists($this->filePtr)){$contents=file_get_contents($t他的->filePtr);$data=explode('|',$contents);如果(isset($data[0])&&isset($data[1])){$this->front=(int)$data[0];$this->rear=(int)$data[1];}}}publicfunctiongetLength(){return(($this->rear-$this->front+$this->memSize)%($this->memSize))/$this->blockSize;}publicfunctionenQueue($value){if($this->ptrInc($this->rear)==$this->front){//团队满returnfalse;}//echo$this->front;$data=$this->encode($value);shmop_write($this->shmId,$data,$this->rear);$this->rear=$this->ptrInc($this->rear);返回$this->decode($data);}publicfunctiondeQueue(){if($this->front==$this->rear){//队空thrownewException("blocksizeisnull!");}$值=小号hmop_read($this->shmId,$this->front,$this->blockSize-1);$this->front=$this->ptrInc($this->front);返回$this->decode($value);}privatefunctionptrInc($ptr){return($ptr+$this->blockSize)%($this->memSize);}privatefunctionencode($value){$data=serialize($value).“__eof”;//回声'';//回声strlen($数据);//回声'';//echo$this->blockSize-1;//回声'';if(strlen($data)>$this->blockSize-1){thrownewException(strlen($data)."是重载块大小!");}返回$数据;}publicfunctionexist($value){//判定队头的数据$data=shmop_read($this->shmId,$this->front,$this->blockSize-1);if($value==$this->decode($data)){返回1;}返回0;}privatefunctiondecode($value){//返回$value;$数据=explode("__eof",$value);返回反序列化($数据[0]);}publicfunction__destruct(){//保存头尾指针$data=$this->front.'|'.$this->后方;file_put_contents($this->filePtr,$data);sem_release($this->semId);//退出临界区,释放信号量}}如何调用$shmq=newShmQueue();进入队列:$data=125;$shmq->enQueue($data);出列:$shmq->deQueue();
