1. 程式人生 > >基於workerman的聊天室

基於workerman的聊天室

Workerman是一款純PHP開發的開源高效能的PHP socket 伺服器框架。用它可以開發出許多高效能的socket應用。
這裡我用它簡單的做了個實時聊天室,支援私聊,非輪詢,併發性也不錯。

首先,看一下核心程式碼:

// 建立一個Worker監聽2345埠,使用websocket協議通訊
$ws = new Worker("websocket://0.0.0.0:2345");
//已連線客戶端 ,便於統計線上使用者
$ws->hasConnections = array();
//監聽客戶端發來訊息
$ws->onMessage = function ($connection, $message
)
use ($ws) {
//握手成功 //解碼客戶端連線發來的訊息 $data = json_decode($message,true); //將已連線客戶端存入變數中 $ws->hasConnections[$connection->id] = array('name' => $data['name'], 'id' => $connection->id); $content = '歡迎 <i>'.$data['name'].'</i> 加入聊天室! '; //拼裝返回的資料結構 $back_data = array( 'content' => $content
, 'nick' => '<b style="color:red">系統:</b>', 'client_id' => $connection->id, 'client_name' => $data['name'], 'type' => 'login', 'clients' => $ws->hasConnections, 'time' => date('Y-m-d H:i') ); //向所有線上使用者廣播訊息 sendMessageToAll($back_data
); };

這裡主要用到worker類的onMessage回撥屬性,當有客戶端的連線上有資料發來時就會觸發,所以我們可已定義個匿名函式進行一些列操作,接下來看一下sendMessageToAll函式

//向所有線上使用者推送訊息
//$ws = new Worker("websocket://0.0.0.0:2345");
function sendMessageToAll($message){
    global $ws;
    foreach ($ws->connections as $connection)
    {
        $connection->send(json_encode($message));

    }
}