赞
踩
thinkphp项目中要用到实时传输,小伙伴觉得功能简单,使用轮询的方式,觉得一来消耗资源,二来不够优雅,所以还是决定用websocket,之前也对比了长链接,SSE等,最终还是选择了websocket一步到位。
很多人说websocket后台配置麻烦,其实实际操作的时候发现网上很多文章写的已经够简洁了,但是缺少一张地图,所以很多人看的一头雾水,有了地图,就非常简单明了了。
1.安装wokerman
2.配置启动器
3.配置controller
4.启动websocket服务
5.客户端调用
安装方式官网推荐使用composer,在项目根目录下运行
composer require topthink/think-worker -vvv
有小伙伴说一直不习惯用composer,那你就直接下载workerman后拷贝到vendor文件夹使用
在项目根目录下创建文件server.php
<?php
#!/usr/bin/env php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','index/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
很多文章中另外配置了namespace,我觉得不太符合小项目的使用习惯就还是放在了index中,如要修改记得与后面的controller配置保持一致
这一步就是新建一个controller,我这里是直接在演示文件夹默认的/index/controller中创建了的Worker.php
<?php namespace app\index\controller; use think\worker\Server; class Worker extends Server{ protected $socket = 'websocket://0.0.0.0:2346'; //公网就用0.0.0.0,自用就用127.0.0.1 public function onMessage($connection, $data) { $connection->send('你给我发送了:'.$data); } /** * 当连接建立时触发的回调函数 * @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) { } }
这一步很多人出问题出在ip上,也是我看很多文章中没有写的,自用就写127.0.0.1,但是大部分小伙伴应该是配置在公网上的,公网就写‘0.0.0.0’,端口自己定义,如果是服务器上记得防火墙打开这个端口
1-3步完成后就可以打开websocket服务了,在项目根目录运行
php server.php start
如果需要常驻后台
nohup php server.php start
显示start success就可以了,如果报错优先检查IP,不是IP问题再好好看报错信息。
ws = new WebSocket("ws://<你的域名>:2346");
ws.onopen = function() {
console.log("连接成功 ");
};
ws.onmessage = function(e) {
console.log("收到服务端的消息:" + e.data);
}
问题不多,认真看下报错就可以,主要问题一般是workerman没有安装好或拷贝好,重新删掉安装一下就好,其次是ip配置问题,这个我刚开始也遇到了,记得公网是0,0,0,0就行,好多人找我都是卡在这里的。
这个问题会比较多一点,基本排查流程是先看服务端websocket有没有启动成功,如果成功了,那检查网络端口有没有开放,尤其是阿里云用户,好几个问我的都是阿里云的安全策略没把端口开放出来。然后再检查客户端设置,因为客户端太简单了,一般问题不怎么会出在这边。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。