上一篇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