一、tp5.1安裝workerman
composer安裝:
composer require topthink/think-worker=2.0.*
二、使用
使用自定義類作為worker入口服務類
在config中創建worker_server.php
<?php
// +----------------------------------------------------------------------
// | Workerman設置 僅對 php think worker:server 指令有效
// +----------------------------------------------------------------------
return [
'worker_class' => 'app\index\controller\Worker', // 自定義Workerman服務類名 支持數組定義多個服務
];
控制器自定義服務類Worker.php
<?php
namespace app\index\controller;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Register;
use GatewayWorker\Gateway;
/**
* 初始化gatewayWorker進程
* Class Worker
* @package app\index\controller
*/
class Worker
{
public function __construct()
{
//初始化register進程
new Register('text://0.0.0.0:1238');
//初始化businessWorker進程
$worker = new BusinessWorker();
$worker->name = 'tuoyuyun';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:1238';
$worker->eventHandler = 'app\index\controller\Events';//通信接收和發送類
//初始化gateway進程
$gateway = new Gateway('tcp://0.0.0.0:32769');//硬件通信ip和開放端口
$gateway->name = 'gateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2900;
$gateway->registerAddress = '127.0.0.1:1238';
}
}
Events.php
<?php
namespace app\index\controller;
use Exception;
use \GatewayWorker\Lib\Gateway;
class Events
{
/**
* 當客戶端連接時觸發
* 如果業務不需此回調可以刪除onConnect
*
* @param int $client_id 連接id
* @throws Exception
*/
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id,'success');
}
/**
* 當客戶端發來消息時觸發
* @param int $client_id 連接id
* @param mixed $message 具體消息
* @throws Exception
*/
public static function onMessage($client_id, $message)
{
//自定義業務處理
$index = new Index();
$porson = $index->onMessage($client_id,$message);
$res = Gateway::isOnline($client_id);
if ($res){
Gateway::sendToClient($client_id,$porson);
}
}
/**
* 當用戶斷開連接時觸發
* @param int $client_id 連接id
* @throws Exception
*/
public static function onClose($client_id)
{
Business::setState($client_id);
// 向所有人發送
GateWay::sendToAll("$client_id logout\r\n");
}
}