在前几天的博客中波波根据thinkPHP5的官方文档对thinkPHP集成workman做了稍微细致的分享。今天波波就将workman的另一版本GatewayWorker的集成方法分享一下。
我们知道如果要做实时通信目前PHP语言主要集中在socket和swool两种开发方式上,如果再深究的话,那么两种方式又是可以称为一种。GatewayWorker是workman的另一版本,其优势在于物联网应用开发方面。废话不多讲。集成Gateway的操作步骤如下:
1、准备好一个tp5的项目。
2、SSH登录服务器,切换到项目根目录执行命令:
- composer require workerman/gateway-worker
3、在项目运行目录中创建启用文件gateway.php,示例如下:
- #!/usr/bin/env php
- <?php
- /**
- * Created by bobo.
- * DateTime: 2018/10/10 22:32
- * Function:CLI模式下运行
- */
- define('APP_PATH', __DIR__ . '/application/');
- define('RUNTIME_PATH', __DIR__ . '/runtime/');
- define('BIND_MODULE','pigeon/start');
- // 加载框架引导文件
- require __DIR__ . '/thinkphp/start.php';
4、在/application/pigeon目录下创建Gateway启动的控制器文件Start.php(注意大小写)。
- <?php
- /**
- * Created by BoBo.
- * Date: 2018/11/15 14:37
- * Function:
- */
- namespace app\pigeon\controller;
- use \Workerman\Worker;
- use \GatewayWorker\Register;
- use \Workerman\WebServer;
- use \GatewayWorker\Gateway;
- use \GatewayWorker\BusinessWorker;
- use \Workerman\Autoloader;
- class Start extends Worker{
- public function __construct(){
- //初始化register
- new Register('text://0.0.0.0:1238');
- //初始化 bussinessWorker 进程
- $worker = new BusinessWorker();
- $worker->name = 'mygate';
- $worker->count = 4;
- $worker->registerAddress = '127.0.0.1:1238';
- //设置处理业务的类,此处制定Events的命名空间
- $worker->eventHandler = '\app\pigeon\controller\Events';
- // 初始化 gateway 进程
- $gateway = new Gateway("websocket://0.0.0.0:8383");
- $gateway->name = 'pigeon';
- $gateway->count = 4;
- $gateway->lanIp = '127.0.0.1';
- $gateway->startPort = 2900;
- $gateway->pingInterval = 10;
- $gateway->pingData = '{"type":"ping"}';
- $gateway->registerAddress = '127.0.0.1:1238';
- //运行所有Worker;
- Worker::runAll();
- }
- }
5、在/application/pigeon目录下创建Gateway的事件处理控制器文件Events.php(注意大小写)。
- <?php
- /**
- * Created by BoBo.
- * Date: 2018/11/15 14:56
- * Function:事件处理类
- */
- namespace app\pigeon\controller;
- use GatewayWorker\Lib\Gateway;
- class Events {
- /**
- * 当客户端发来消息时触发
- * @param int $client_id 连接id
- * @param mixed $data 具体消息
- */
- public static function onMessage($client_id, $data){
- $message = json_decode($data, true);
- Gateway::sendToCurrentClient(json_encode($data));
- }
- /**
- * 当客户端连接时触发
- * 如果业务不需此回调可以删除onConnect
- *
- * @param int $client_id 连接id
- */
- public static function onConnect($client_id)
- {
- Gateway::sendToClient($client_id,json_encode(['status'=>"success",'msg'=>"连接成功"]));
- }
- /**
- * 当连接断开时触发的回调函数
- * @param $connection
- */
- public static function onClose($client_id){
- Gateway::sendToClient($client_id,json_encode(['status'=>"error",'msg'=>"断开连接"]));
- }
- /**
- * 当客户端的连接上发生错误时触发
- * @param $connection
- * @param $code
- * @param $msg
- */
- public static function onError($client_id, $code, $msg){
- echo "error $code $msg\n";
- }
- /**
- * 每个进程启动
- * @param $worker
- */
- public static function onWorkerStart($worker){
- }
- }
6、启动GatewayWorker。(终端中输入如下指令)
- php gateway.php start
看到如下画面就表示集成成功了。
今天的分享就到这里,有空的话再分享双协议下的端口转发,敬请关注。