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即可。

tp5整合workerman和Gateway实现WebSocket推送