一、参考网站
tp开发手册:https://www.kancloud.cn/manual/thinkphp6_0/1147857
workman与tp框架结合参考:http://doc2.workerman.net/work-with-other-frameworks.html
开发手册只介绍了Workman的使用方法,没有介绍GatewayWorker的使用方法,通过
composer require topthink/think-worker
安装了workman之后可以看到config目录下多出了gateway_worker.php、work.php、worker_server.php三个配置文件,
其中gateway_worker.php就是GatewayWorker的配置文件,这里主要是讲在TP6框架下怎么来使用他,其他两个文档有介绍。
二、使用步骤
1、自定义你的事件类文件
在你的应用app目录下新建一个http目录,目录下新建一个Events.php文件
引用http://doc2.workerman.net/getting-started.html的入门指引告诉你为什么这样做
业务开发的话,你真的只需要关注Events.php这一个文件就好了
2、初始化你的Events.php文件的内容
按下图方式顺序找到位于框架根目录->vendor->topthink->think-worker->src目录下的Events.php
打开文件ctrl+a,然后ctrl+c,直接全选复制,最后拷贝到你自定义的Events.php文件内,然后修改下面截图两处地方
保存之后你的自定义事件类文件内容就是这样的
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// namespace think\worker; // 原文件的命名空间
namespace app\http; // 你的类文件的命名空间
use GatewayWorker\Lib\Gateway;
use Workerman\Worker;
use think\worker\Application; // 特别注意:下方用到的Application属于think\work命名空间下的类,由于命名空间的更换,需要这样引入才能使用,否则会报错找不到这个类。
/**
* Worker 命令行服务类
*/
class Events
{
/**
* onWorkerStart 事件回调
* 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
*
* @access public
* @param \Workerman\Worker $businessWorker
* @return void
*/
public static function onWorkerStart(Worker $businessWorker)
{
$app = new Application;
$app->initialize();
}
/**
* onConnect 事件回调
* 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
*
* @access public
* @param int $client_id
* @return void
*/
public static function onConnect($client_id)
{
Gateway::sendToCurrentClient("Your client_id is $client_id");
}
/**
* onWebSocketConnect 事件回调
* 当客户端连接上gateway完成websocket握手时触发
*
* @param integer $client_id 断开连接的客户端client_id
* @param mixed $data
* @return void
*/
public static function onWebSocketConnect($client_id, $data)
{
var_export($data);
}
/**
* onMessage 事件回调
* 当客户端发来数据(Gateway进程收到数据)后触发
*
* @access public
* @param int $client_id
* @param mixed $data
* @return void
*/
public static function onMessage($client_id, $data)
{
Gateway::sendToAll($data);
}
/**
* onClose 事件回调 当用户断开连接时触发的方法
*
* @param integer $client_id 断开连接的客户端client_id
* @return void
*/
public static function onClose($client_id)
{
GateWay::sendToAll("client[$client_id] logout\n");
}
/**
* onWorkerStop 事件回调
* 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
*
* @param \Workerman\Worker $businessWorker
* @return void
*/
public static function onWorkerStop(Worker $businessWorker)
{
echo "WorkerStop\n";
}
}
3、最后修改配置文件
修改config目录下gateway_worker.php文件如下
此处只需将“\think\worker\Events”修改为“app\http\Events”即可完成最后步骤,至此你就已经把GatewayWorker和TP6完美整合起来了,接下来就可以愉快的使用php think worker:gateway来启动我们的GatewayWorker了,具体的onWorkerStart、onConnect、onWebSocketConnect、onMessage、onClose、onWorkerStop事件你都可以在你自定义的Events.php业务类里随意操作了。
4、其他使用方式
以上是采用客户端与GatewayWorker直接双向通讯的方式完成业务通讯,当然你也可以采用官方推荐的GatewayClient的方式,具体使用方法就参考官网示例就行了:http://doc2.workerman.net/work-with-other-frameworks.html。
第一次发文,我也只是一个TP6初学者,如果有写得不对的地方,还请各位大佬指正,如果对您有用,请点个赞吧。
5、个人小程序展示
这个我自己做的一个个人小程序,有兴趣的扫来看一看哇。