项目背景:
自己做的项目(基于TP5框架)需要个语音通知系统,只要我的后台接收到了信息,我就发送消息给微信小程序,于是就用到了workman。
使用工具:
TP5(thinkphp5)+Workerman
整体思路:
用workman的soket链接,当项目需要发消息的时候,发送给小程序,然后小程序根据传过来的数据做逻辑判断选择是否播报语音。
实现过程:
1、安装workman
(对于composer工具,作为标准小白是一直不会用的。其实用很简单,打开命令行工具,就是电脑自带的命令行,定位到自己的项目文件夹里去,然后按照workman文档里的命令粘贴进去,就可以安装。我的服务器是阿里云linux系统的,所以我执行的是以下两条命令。因为每个人的服务器都不一样,规则不同,所以执行的情况就不一样。我也遇到了错误,基本上都能百度到原因,差不多就是版本不匹配的原因。)
命令:阿里云下composer安装,先切换镜像:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
安装命令:
composer require topthink/think-worker=1.0.*
注意自己TP5的版本哈。以下是我个人理解的小白总结,如果有不对,大佬指正哈:
接下来根据版本选择composer:
tp5.0-worker1.0
tp5.1-worker2.0
tp6-worker3.o
当你看到自己项目里vendor文件夹里多出来俩文件夹:topthink和workman,就是成功了。
2、启动workman
在项目的根目录,也就是和application同级的目录写一个启动文件,通过命令行执行。
<?php
// +----------------------------------------------------------------------
// | Workerman启动页
// | Author: Worker fan
// +----------------------------------------------------------------------
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','worker/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
这个文件随便命名,我的叫service.php
然后构建服务器的处理消息模块,按照上面文件写的规则建立控制器。
<?php
/*
workerman的控制器
Author:workerfan
*/
namespace app\worker\controller;
use think\worker\Server;
class Worker extends Server
{
protected $socket = 'websocket://0.0.0.0:9383';
/**
* 收到信息
* @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)
{
}
}
上面是个文档里的代码,我对于workerman的需求比较简单,所以就用了最精简的控制器。因为是小程序通信,所以监听的是:0.0.0.0,如果是项目内通信,可以监听:127.0.0.1。端口自己随便定义,只要不被占用就行。
写好上面这些文件,就可以启动了。
启动命令两种:
php service.php start (这种启动会随着终端断开而断开)
php service.php start -d (这种启动就会一直保持在线,除非手动关停,所以叫守护进程启动,其实字面理解就能理解。)
一般都是第二种命令启动。
3、微信小程序链接workman
这一步费时挺多,因为啥都不懂,所以很狂暴。
其实都是挺简单的问题,就是小白啥都不懂,所以得一点点自己慢慢找线索。
因为每一个小白的服务器配置都不一样,所以遇到的问题也五花八门因此也没有固定回答。
这里我就说两个可能是最通用的小白问题吧。
首先是微信小程序的代码,很简单:
//连接socket服务器
wx.connectSocket({
url: 'wss://www.*************.com:443/wss',
success:(function(){
console.log("发送请求");
})
});
//socket打开时执行的事情
wx.onSocketOpen(function(res) {
wx.sendSocketMessage('Hellow,service');
console.log("给服务器发一个问候");
});
wx.onSocketError(function(errMsg){
console.log("错误:".errMsg);
})
//服务器给用户发信息触发的事件
wx.onSocketMessage(function(res) {
console.log("收到服务端的消息:" + res.data);
});
首先微信小程序socket是只能和https进行通讯的,所以网站必须是https的。配置https网站如果你用的是宝塔的管理平台就非常简单了,只需要到自己网站下找到ssl配置把证书给粘贴进去就行。然后把workman里关于转发的服务器配置给粘贴到自己的服务器配置上去就可以了。
这里会有俩常见问题。
1)端口没有放行,会有连接超时的警告或者错误。
宝塔的管理虽然也可以放行端口,但是貌似不是绝对,到阿里云的控制台的安全规则里面没有发现端口被放行,于是总是超时。
所以workman开了的时候,要先用命令测试下,自己的端口能不能访问到。
2) 客户端访问地址的书写错误,会导致ssl协议不正确的错误。
因为对配置文件的内容有误解,一开始访问的地址写的都是自己配置的端口号。后来知道了原理,nginx服务器监听的是443端口,自己修改的端口是从443转发到上面去的。所以url地址应该是:
wss://****.com:443/wss
而不是wss://****.com:3344/wss
这点很重要,估计能解决大把小白的疑惑。
做完以上这些,微信小程序就能成功和workman通信了,nice.
总结:
workman是一个很棒的php框架,就和它介绍自己一样,填充了php关于socket的很多空白,相信它将来一定会越来越好。对于我们这类的小白,因为基础知识的欠缺,所以有些答案就没有真正解决问题。其实,控制台回馈的错误就很好的告诉了问题的所在,只要静下心来一步步地根据错误去解决问题,最终都会有一个正确的答案的。以上。就是作为小白总结的全部内容了,希望能对别人有所帮助。
最后,感谢workman!
如果对你有所帮助,希望你留下自己的评论,这样我们就能帮助更多的人了,加油!
画重点,“阿里云安全组放行端口”,之前入过坑。
类似功能已经用在了app、h5、和各大小程序,不过和你的思路不太一样
兄台啥思路,给个简述呀- -
大佬,有问题请教,你这个怎么返回啊