上一篇blog,简单记录了一下php中System V消息队列的相关知识。
这篇记录一下如何用php实如今多个客户和单个服务器之间复用消息。
以下图:
上图是一个很简单的模型。
下面是代码
server端代码:php
<?php $type = 1; // 服务器端从消息队列中获取的消息类型 $defaultPath = './index'; // 默认的请求文件路径 $queueKey = ftok(__FILE__,'a'); file_put_contents('./msg_queue.key',$queueKey); $msgQueue = msg_get_queue($queueKey); echo 'listening ....'."\n"; while (true) { msg_receive($msgQueue,$type,$msg_type,1024,$message); if ($message) { response($message, $msgQueue); } sleep(1); } function response($message, $msgQueue) { if (empty($message) || empty($message['pid'])) { return false; } $pid = $message['pid']; $path = empty($message['path']) ? $defaultPath : $message['path']; $content = ''; if ( file_exists($path) ) { $content = file_get_contents($path); } msg_send($msgQueue,$pid,$content); }
客户端代码服务器
<?php $path = empty($argv[1]) ? './index' : $argv[1]; $keyFile= './msg_queue.key'; $queueKey = file_get_contents($keyFile); if (empty($queueKey)) { die('no key in file'); } $msgQueue = msg_get_queue($queueKey);// 获取或建立一个消息队列,当这个队列不存在时,建立之,存在就返回。 $pid = getmypid(); // send request data to the server $request = [ 'pid' => $pid, 'path' => $path, ]; msg_send($msgQueue,1,$request); // receive data from the server while (1) { //msg_receive($msgQueue,$pid,$msgType,1024,$response,true,MSG_NOERROR); msg_receive($msgQueue,$pid,$msgType,1024,$response); if($response) { print_r($response); break; } }
有个问题,当客户端请求的问题内容不少时,就出现阻塞了。。。。不过这个简单的模型算是练一下手吧。spa