1. 程式人生 > 實用技巧 >Swoole的webSocket部分服務端封裝

Swoole的webSocket部分服務端封裝

//封裝單例模式(三私一公)
class SwooleWebSocket
{
private static $instance; //存放當前物件屬性
private static $server; //存放webSocket物件屬性

private $dir = 'swooleLogs/swoole.log';

private function __construct() {
//建立webSocket物件
self::$server = new Swoole\WebSocket\Server('0.0.0.0', 9505);
//設定引數
self::$server->set([
'daemonize' => 1, // 作為守護程序執行,需同時設定log_file
'log_file' => $this->dir, // 指定標準輸出和錯誤日誌檔案
]);
//註冊事件
self::$server->on('open',[$this,'onOpen']); //將當前類中的onOpen方法作為open的事件處理函式
self::$server->on('message',[$this,'onMessage']);
self::$server->on('close',[$this,'onClose']);
}

private function __clone() {
// TODO: Implement __clone() method.
trigger_error('Clone is not allowed !');
}

public static function getInstance() {
if ( !(self::$instance instanceof self) ){
self::$instance = new self();
}
return self::$instance;
}

//當前客戶端連線之後要執行的方法
public function onOpen($server,$request) {
echo "client: {$request->fd}\n";
$server->push($request->fd, "hello, welcome\n");
}

//當客戶端向伺服器傳送訊息時要執行的方法
public function onMessage($server,$frame) {
//處理業務邏輯
echo "client: {$frame->data}\n";
$server->push($frame->fd, "server: {$frame->data}");
}

//當客戶端和服務端斷開連線時要執行的方法
public function onClose($server,$fd) {
echo "client-{$fd} is closed\n";
}

//啟動webSocket方法
public static function start(){
self::$server->start();
}
}

SwooleWebSocket::getInstance()->start();