准备条件
1、已安装composer
2、环境变量中配置了php
3、安装好fastadmin或者tp5及以上版本
通过composer安装think-worker
composer require topthink/think-worker=1.0.*
在window下做服务端,还需下载workerman
composer require workerman/workerman-for-win
在根目录下创建server.php文件
#!/usr/bin/env php
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
在app目录下创建push文件->controller文件->Worker.php,可以通过命令直接生成
php think make:controller push/Worker
代码替换为:
<?php
namespace app\push\controller;
use think\Db;
use think\worker\Server;
use Workerman\Lib\Timer;
class Worker extends Server
{
protected $socket = 'websocket://0.0.0.0:2346';
protected $heartbeat_time = '55';
/**
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $datas)
{
$connection->lastMessageTime = time();
$data = json_decode($datas,true);
switch ($data['type']) {
case 'login':
/*登录逻辑*/
$connection->send('login');
break;
case 'send':
$connection->send('ping');
break;
case 'eservation':
$connection->send('eservation');
break;
}
}
/**
* 当连接建立时触发的回调函数
* @param $connection
*/
public function onConnect($connection)
{
// $connection->send('ping');
}
/**
* 当连接断开时触发的回调函数
* @param $connection
*/
public function onClose($connection)
{
$connection->send('close');
}
/**
* 当客户端的连接上发生错误时触发
* @param $connection
* @param $code
* @param $msg
*/
public function onError($connection, $code, $msg)
{
echo "error $code $msg\n";
}
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker)
{
Timer::add(10, function () use ($worker) {
$time_now = time();
foreach ($worker->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// $diff_time = $time_now - $connection->lastMessageTime;
// $msg = '距离上次通话已经过去' . $diff_time . '秒';
// $connection->send($msg);
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > $this->heartbeat_time) {
$connection->close();
}
}
});
}
}
在根目录运行命令,启动服务,调试用start可以看到打印的数据,线上运行加上 -d
php server.php start
php server.php start -d
测试是否链接成功,可以访问线上测试websocket/ws/wss在线调试测试工具
遇到数据库因为长联断开连接,可以在app\database.php文件中添加代码
// 是否需要断线重连
'break_reconnect' => true,