TP5安装使用wokerman做聊天系统,存储用户线程,根据对应线程发送消息

终极小白也看的懂得 TP5安装使用wokerman

先安装composer,这里就不做具体介绍

	composer require topthink/think-worker -vvv

报错:Installation failed, reverting ./composer.json to its original cont
使用如下命令:

	composer require topthink/think-worker=1.0.* -vvv

如果需要在window下做服务端,还需要:

	composer require workerman/workerman-for-win -vvv

在tp5的根目录中添加server.php文件,文件内容如下:

	define('APP_PATH', __DIR__ . '/application/');
    define('BIND_MODULE','push/Worker');
    // 加载框架引导文件
    require __DIR__ . '/thinkphp/start.php';

3-新建模块和控制器
创建workerman的controller,命名为Worker.php。在application/push/controller,目录不存在自行创建。文件内容如下:


/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/11/16
 * Time: 11:31
 */
namespace app\push\controller;
use think\worker\Server;
class Worker extends Server
{
    protected $socket = 'websocket://127.0.0.1:2346';  //使用服务器的内网ip
    protected $thread=[];  //定义一个存储用户线程的空数组
    protected $num=0;
    public function onMessage($connection, $data)   //收到客户端发送过来的请求
    {
        $connection->send('我收到你的信息了'); 
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        if(isset($connection->uid))
        {
            // 连接断开时删除映射
            unset($this->thread[$connection->uid]);  //用户断开删除这个线程
            echo count($this->thread);
        }
    }
    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {
//        var_dump($worker);
    }

}

4-在linux中使用cd到tp的根目录启动监听,使用:

	php server.php start 

5-添加一个html页面:

	
<html>
<head>
    <meta charset="UTF-8">
    <title>title>
    <script type="text/javascript">
        // 假设服务端ip为127.0.0.1
        //使用服务端外网ip 
        ws = new WebSocket("ws://127.0.0.1:2346");  
        ws.onopen = function() {
            console.log("连接成功");
            ws.send('tom');
            console.log("给服务端发送一个字符串:tom");
        };
        ws.onmessage = function(e) {
            console.log("收到服务端的消息:" + e.data);
        };
    script>
head>
<body>
body>
html>

启动成功之后是如下界面:

TP5安装使用wokerman做聊天系统,存储用户线程,根据对应线程发送消息_第1张图片
也可以使用 php server.php restart -d 使用后台守护,退掉依然可以运行,需要注意的是域名是https在js中连接会提示连接不安全,具体可能需要重新配置服务器,具体这里就不多做介绍了。
在做聊天存储对应的线程给对应的用户发送消息,需要在页面中send(‘json后的数组’)数组到后端,对线程分类的操作:

	public function onMessage($connection, $data)   //收到客户端发送过来的请求
    {
        $data=json_decode($data,true);  //对前端发送过来的消息json转码
        /**
         * 对请求进行 分类对应的请求做对应的操作
         */
        if($data['type']=='thread'){ //用户启动socket 首先先执行这个操作 把用户存储到线程当中
            $connection->uid=$this->uid;
            $this->thread[$connection->uid]=$connection; //把当前的用户id存到线程当中
            $this->thread[$connection->uid]->send('我收到你的信息了');  //使用存起来的线程发送消息
        }
        if($data['type']=='test'){
            echo count($this->thread);  //查看线程的长度
            $this->thread[$this->uid]->send('我收到你的信息了');  //使用用户的对应id的对应线程  来发送对应的消息
        }

    }
	/**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
	 public function onClose($connection)
    {
        if(isset($connection->uid))
        {
            // 连接断开时删除映射
            unset($this->thread[$connection->uid]);  //用户断开删除这个线程
            echo count($this->thread);
        }
    }

步骤提示:
1.使用composer下载wokerman
2.使用push/Worker控制器
3.在客户端使用服务器的外网ip (注意!!!)
4.在Worker控制器中使用内网ip( 注意!!!)
5.linux需要在服务器防火墙中开启scoket对应的端口 例如:2346 (https中使用scoket会提示不安全连接)
6.连接上就把用户线程存起来,这只是一个思路,具体的还得自己添加
7.对每条请求进行分类处理前台发送的时候添加一个type,后端判断类型做对应的操作

借鉴了 qq_37138818的原文:https://blog.csdn.net/qq_37138818/article/details/81335070
,在基础上一下增加了一点细节,在windows和linux都做过测试,网络上博客一些细节上东西可能不适合小白,所以这边做了相对比较细的介绍

你可能感兴趣的:(TP5安装使用wokerman做聊天系统,存储用户线程,根据对应线程发送消息)