<?php
namespace app\index\controller;
use Workerman\Worker;
use GatewayWorker\Gateway;
use Workerman\Autoloader;
class Sgateway{
public function __construct(){
// gateway 進(jìn)程
$gateway = new Gateway("Websocket://0.0.0.0:7272");
// 設(shè)置名稱,方便status時(shí)查看
$gateway->name = 'ChatGateway';
// 設(shè)置進(jìn)程數(shù),gateway進(jìn)程數(shù)建議與cpu核數(shù)相同
$gateway->count = 4;
// 分布式部署時(shí)請(qǐng)?jiān)O(shè)置成內(nèi)網(wǎng)ip(非127.0.0.1)
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會(huì)使用4000 4001 4002 4003 4個(gè)端口作為內(nèi)部通訊端口
$gateway->startPort = 2300;
// 心跳間隔
$gateway->pingInterval = 10;
// 心跳數(shù)據(jù)
$gateway->pingData = '{"type":"ping"}';
// 服務(wù)注冊(cè)地址
$gateway->registerAddress = '127.0.0.1:1236';
/*
// 當(dāng)客戶端連接上來(lái)時(shí),設(shè)置連接的onWebSocketConnect,即在websocket握手時(shí)的回調(diào)
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
// 可以在這里判斷連接來(lái)源是否合法,不合法就關(guān)掉連接
// $_SERVER標(biāo)識(shí)來(lái)自哪個(gè)站點(diǎn)的頁(yè)面發(fā)起的websocket鏈接
if($_SERVER != 'http://chat.workerman.net')
{
$connection->close();
}
// onWebSocketConnect 里面$_GET $_SERVER是可用的
// var_dump($_GET, $_SERVER);
};
};
*/
// 如果不是在根目錄啟動(dòng),則運(yùn)行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
}
}
<?php
namespace app\index\controller;
use Workerman\Worker;
use GatewayWorker\Register;
class Sregister{
public function __construct(){
// register 服務(wù)必須是text協(xié)議
$register = new Register('text://0.0.0.0:1236');
// 如果不是在根目錄啟動(dòng),則運(yùn)行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
}
}
<?php
namespace app\index\controller;
use Workerman\Worker;
use GatewayWorker\BusinessWorker;
use Workerman\Autoloader;
class Sbusinessworker{
public function __construct(){
// bussinessWorker 進(jìn)程
$worker = new BusinessWorker();
// worker名稱
$worker->name = 'ChatBusinessWorker';
// bussinessWorker進(jìn)程數(shù)量
$worker->count = 4;
// 服務(wù)注冊(cè)地址
$worker->registerAddress = '127.0.0.1:1236';
//設(shè)置處理業(yè)務(wù)的類,此處制定Events的命名空間
$worker->eventHandler = 'app\index\controller\Events';
// 如果不是在根目錄啟動(dòng),則運(yùn)行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
}
}
以上是三個(gè)PHP 文件代碼
啟動(dòng)沒(méi)有問(wèn)題,但是在頁(yè)面上連接websocket就報(bào)錯(cuò)
報(bào)錯(cuò)信息
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://wiki.workerman.net/Error3 for detail
我不知道自己的代碼哪里寫錯(cuò)!請(qǐng)大神幫忙看一下!
[attach]2151[/attach]
直接運(yùn)行start_for_win.bat腳本沒(méi)有問(wèn)題
腳本里面內(nèi)容 php start_register.php start_gateway.php start_businessworker.phppause
?
HTML頁(yè)面上連接websocket時(shí)報(bào)錯(cuò)
[attach]2153[/attach]
?
?
項(xiàng)目的目錄結(jié)構(gòu)
[attach]2152[/attach]
?
?
上面的代碼對(duì)應(yīng)的就這幾個(gè)控制器
Events.php的內(nèi)容截圖下
<?php
namespace app\index\controller;
/**
/**
class Events
{
/**
@param mixed $message
*/
public static function onMessage($client_id, $message)
{
// debug
echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id session:".json_encode($_SESSION)." onMessage:".$message."\n";
// 客戶端傳遞的是json數(shù)據(jù)
$message_data = json_decode($message, true);
if(!$message_data)
{
return ;
}
// 根據(jù)類型執(zhí)行不同的業(yè)務(wù)
switch($message_data['type'])
{
// 客戶端回應(yīng)服務(wù)端的心跳
case 'pong':
return;
// 客戶端登錄 message格式: {type:login, name:xx, room_id:1} ,添加到客戶端,廣播給所有客戶端xx進(jìn)入聊天室
case 'login':
// 判斷是否有房間號(hào)
if(!isset($message_data['room_id']))
{
throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
}
// 把房間號(hào)昵稱放到session中
$room_id = $message_data['room_id'];
$client_name = htmlspecialchars($message_data['client_name']);
$_SESSION['room_id'] = $room_id;
$_SESSION['client_name'] = $client_name;
// 獲取房間內(nèi)所有用戶列表
$clients_list = Gateway::getClientSessionsByGroup($room_id);
foreach($clients_list as $tmp_client_id=>$item)
{
$clients_list[$tmp_client_id] = $item['client_name'];
}
$clients_list[$client_id] = $client_name;
// 轉(zhuǎn)播給當(dāng)前房間的所有客戶端,xx進(jìn)入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);
// 給當(dāng)前用戶發(fā)送用戶列表
$new_message['client_list'] = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));
return;
// 客戶端發(fā)言 message: {type:say, to_client_id:xx, content:xx}
case 'say':
// 非法請(qǐng)求
if(!isset($_SESSION['room_id']))
{
throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}");
}
$room_id = $_SESSION['room_id'];
$client_name = $_SESSION['client_name'];
// 私聊
if($message_data['to_client_id'] != 'all')
{
$new_message = array(
'type'=>'say',
'from_client_id'=>$client_id,
'from_client_name' =>$client_name,
'to_client_id'=>$message_data['to_client_id'],
'content'=>"<b>對(duì)你說(shuō): </b>".nl2br(htmlspecialchars($message_data['content'])),
'time'=>date('Y-m-d H:i:s'),
);
Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message));
$new_message['content'] = "<b>你對(duì)".htmlspecialchars($message_data['to_client_name'])."說(shuō): </b>".nl2br(htmlspecialchars($message_data['content']));
return Gateway::sendToCurrentClient(json_encode($new_message));
}
$new_message = array(
'type'=>'say',
'from_client_id'=>$client_id,
'from_client_name' =>$client_name,
'to_client_id'=>'all',
'content'=>nl2br(htmlspecialchars($message_data['content'])),
'time'=>date('Y-m-d H:i:s'),
);
return Gateway::sendToGroup($room_id ,json_encode($new_message));
}
}
/**
@param integer $client_id 客戶端id
*/
public static function onClose($client_id)
{
// debug
echo "client:{$_SERVER['REMOTE_ADDR']}:{$_SERVER['REMOTE_PORT']} gateway:{$_SERVER['GATEWAY_ADDR']}:{$_SERVER['GATEWAY_PORT']} client_id:$client_id onClose:''\n";
// 從房間的客戶端列表中刪除
if(isset($_SESSION['room_id']))
{
$room_id = $_SESSION['room_id'];
$new_message = array('type'=>'logout', 'from_client_id'=>$client_id, 'from_client_name'=>$_SESSION['client_name'], 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
}
}
}