PHP中SystemV 消息隊列實現多個客戶和單個服務器之間複用消息

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

相關文章
相關標籤/搜索