先安装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>
启动成功之后是如下界面:
也可以使用 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都做过测试,网络上博客一些细节上东西可能不适合小白,所以这边做了相对比较细的介绍