小白使用workman指南

独孤紫龙

项目背景:

自己做的项目(基于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!

7566 5 0
5个评论

独孤紫龙

如果对你有所帮助,希望你留下自己的评论,这样我们就能帮助更多的人了,加油!

  • 暂无评论
喵了个咪

画重点,“阿里云安全组放行端口”,之前入过坑。

  • 暂无评论
煮酒品天下

类似功能已经用在了app、h5、和各大小程序,不过和你的思路不太一样

  • 暂无评论
独孤紫龙

兄台啥思路,给个简述呀- -

  • 暂无评论
rookieSocket

大佬,有问题请教,你这个怎么返回啊

  • 暂无评论
年代过于久远,无法发表评论

独孤紫龙

106
积分
0
获赞数
0
粉丝数
2020-06-08 加入
🔝