前言
最近接触学习了一点swoole知识,想动手练习一下,一来闲来无事,二来巩固知识,于是便萌生了用swoole搭建websocket,实现小程序与pc后台即时通信功能。第一此做类似这样通讯功能,也没有完整清晰的思路,做的有点缓慢,在做的过程中一步步思考思路才慢慢清晰出来。
正文
- 在TP5项目中搭建websocket服务
在项目根目录下创建server文件夹,在其下新建ws.php文件,作为创建ws服务的脚本。
<?php
use app\common\Websocket;
class Ws {
const HOST = "0.0.0.0";
const PORT = 8080;
public $ws = null;
public function __construct()
{
$this->ws = new swoole_websocket_server(self::HOST, self::PORT, SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$this->ws->set([
'document_root' => __DIR__.'/../public',
'worker_num' => 2,
'ssl_key_file' => '/usr/xxx.key',
'ssl_cert_file' => '/usr/xxx.crt'
]);
$this->ws->on('open', [$this, 'onOpen']);
$this->ws->on('message', [$this, 'onMessage']);
$this->ws->on('workerstart', [$this, 'onWorkerstart']);
$this->ws->on('close', [$this, 'onClose']);
$this->ws->start();
}
//客户端连接后
public function onOpen($server, $request)
{
Websocket::init()->open($this->ws, $request);
}
//客户端发送消息
public function onMessage($server, $fram)
{
Websocket::init()->sendMsgAndSave($this->ws, $fram->fd, json_decode($fram->data));
}
public function onWorkerstart($server, $worker_id)
{
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 1. 加载基础文件
require __DIR__ . '/../thinkphp/start.php';
Websocket::init()->flushCache();
}
//客户端断开连接
public function onClose($server, $fd, $reactorId)
{
Websocket::init()->removeRedisCache($fd);
}
}
new Ws();
上方可以看出,我是以8080端口作为websocket服务,因为小程序只支持wss连接,所以需要自己申请域名ssl证书。(原来小程序我记得好像后台设置可信域名只支持80或443端口,不知道哪个版本更新,现在支持其他端口的设置。)
上方四个回调函数里面具体做了哪些事情我们先不急看。先看下onWorkerstart回调函数中,其实就是TP5.0入口文件所做的事情,载入框架信息。(Tips:因为swoole是常驻内存的,所以当改变websocket服务所调用的方法,或者框架核心代码,需要重启websocket服务
)
在linux服务器中,进入根目录下执行:php ./server/ws.php 此时websocket服务端便运行起来。
- 小程序端连接
var socketTask = wx.con