tp5整合workerman和Gateway实现WebSocket推送
前段时间公司要开发一套聊天系统,在网上找了很多资料,最终在swoole和workerman两个框架中选择了workerman,由于公司用的底层框架是tp5.0,所以还需要整合一下,刚刚整合完成tp5+workerman,才发现还有gateway这款更加轻巧的框架,具官网介绍,gateway更加适合开发聊天系统,而且放出的Api相当齐全,下面就将tp5整合workerman和gateway的过程说一下,过程还是非常简单的,但是一些细节的地方还是需要注意的,由于网上的教程都是复制黏贴的,很多地方已经过时了,在整合gateway的过程中遇到了几个坑,但是整合好了之后才发现真的要比workerman要好用很多。
整合前请确保你的电脑已经安装Composer。
Tp5整合WorkerMan:
1、命令行工具定位到tp5框架根目录(注意不是网站根目录public,而是和application同级的目录)
2、执行Composer安装命令:
composer require topthink/think-worker
3、如果你的服务器是Windows,需要使用如下命令安装Windows版本的Workerman
composer require workerman/workerman-for-win
4、在thinkphp根目录(和application同级的目录)创建server.php文件,加入如下代码
<?php efine('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','push/Worker'); // 加载框架引导文件 require __DIR__ . '/thinkphp/start.php';
我们都知道index.php是一个入口文件,而我们刚刚创建的server.php就是workerman的入口文件。
5、创建目录:application/push/controller,并在这个目录中创建Event.php文件,添加如下代码:
<?php namespace app\push\controller; use think\worker\Server; class Worker extends Server { protected $socket = 'websocket://127.0.0.1:2346'; /** * 收到信息 * @param $connection * @param $data */ public function onMessage($connection, $data) { $connection->send('我收到你的信息了'); } /** * 当连接建立时触发的回调函数 * @param $connection */ public function onConnect($connection) { } /** * 当连接断开时触发的回调函数 * @param $connection */ public function onClose($connection) { } /** * 当客户端的连接上发生错误时触发 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "error $code $msg\n"; } /** * 每个进程启动 * @param $worker */ public function onWorkerStart($worker) { } }
代码:
websocket://127.0.0.1:2346
中的2346是端口号,可以任意修改,但是一定要确保端口号可以被外网访问,不然不能实现通信。
6、命令行执行命令:php server.php 即可运行workerman。
7、如果你已经有前端websocket项目,可以自行测试workerman是否能跑的通,如果没有前端websocket项目,可以百度“websocket在线测试工具”,使用在线工具进行测试。
Tp5整合Gateway:
首先还是需要祭出我们的神器Composer执行如下命令:
composer require workerman/gateway-worker-for-win
这里是最关键的一步,看到很多人说需要去官网地址:http://www.workerman.net/download下载一个demo,但是打开之后并没有windows版的demo,只有linux版本的,我们需要去http://www.workerman.net/download/GatewayWorker.zip下载demo。
和整合worker一样,也需要创建application/push/controller文件夹。
将刚刚下载的demo解压,将Applications/Yourapp里面的四个php文件复制到你刚刚创建的目录当中,也就是:
start_register.php
start_gateway.php
start_businessworker.php
Events.php
打开start_gateway.php文件,找到代码:
$gateway = new Gateway("tcp://0.0.0.0:8282");
改为
$gateway = new Gateway("websocket://0.0.0.0:8282");
这里一定要改,并且要确保服务器的8282端口可以让外网访问(也可以修改为其它端口,但一定要确保外网可以访问的到),不然无法实现websocket通信。
在tp5.0创建start.php文件,内容如下:
<?php /** * run with command * php start.php start */ ini_set('display_errors', 'on'); use Workerman\Worker; if(strpos(strtolower(PHP_OS), 'win') === 0) { exit("start.php not support windows, please use start_for_win.bat\n"); } // 检查扩展 if(!extension_loaded('pcntl')) { exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); } if(!extension_loaded('posix')) { exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n"); } // 标记是全局启动 define('GLOBAL_START', 1); require_once __DIR__ . '/vendor/autoload.php'; // 加载所有Applications/*/start.php,以便启动所有服务 foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file) { require_once $start_file; } // 运行所有服务 Worker::runAll();
如果你的服务器是Linux版本,那么直接命令行执行命令:php start.php start 即可成功运行。
如果你的服务器是Windows版本,那么打开你刚刚下载demo文件夹,找到start_for_win.bat文件,将这个文件复制到你的tp5框架的根目录,直接双击运行start_for_win.bat即可。