基於workerman的聊天室
阿新 • • 發佈:2019-01-27
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));
}
}