<?php
// 后台
require __DIR__ . '/vendor/autoload.php';
use Workerman\Timer;
use Workerman\Worker;
require 'csp.php';
// 创建一个 WebSocket 服务器实例,监听 6161 端口
$ws_worker = new Worker("websocket://0.0.0.0:6161");
// 启动 1 个进程来处理 WebSocket 连接
$ws_worker->count = 1;
// 存储每个连接的 ID
$connections = [];
// 当收到客户端消息时触发
$ws_worker->onMessage = function($connection, $data) use ($ws_worker, &$connections) {
// 字符串通过.分割成数组
$data_parts = explode('.', $data);
$command = $data_parts[0]; // 获取第一个部分作为命令
$argument = isset($data_parts[1]) ? $data_parts[1] : null; // 获取第二个部分作为参数(如果有)
// 连接的唯一标识符
$connection_id = spl_object_id($connection);
// 记录连接 ID
if (!isset($connections[$connection_id])) {
$connections[$connection_id] = $connection;
}
switch ($command) {
case '待处理':
// 定时器间隔调整为 1秒
$timer_id = Timer::add(1, function() use ( &$last_data_hash, $connection) {
// 查询数据库中的数据
$sjk = sjk("SELECT * FROM bd");
// 计算当前数据的哈希值
$current_data_hash = md5(json_encode($sjk));
// 判断数据是否有变化
if ($current_data_hash !== $last_data_hash) {
// 如果数据有变化,更新哈希值
$last_data_hash = $current_data_hash;
// 发送数据给特定客户端
$connection->send(jk(data: $sjk, if: false));
}
// 手动释放不再需要的变量
unset($sjk);
unset($current_data_hash);
});
// 当连接断开时,删除定时器,防止内存泄漏
$connection->onClose = function($connection) use ($timer_id, &$connections) {
$connection_id = spl_object_id($connection);
Timer::del($timer_id);
// 移除连接 ID
if (isset($connections[$connection_id])) {
unset($connections[$connection_id]);
}
};
break;
case '总统计':
// 定时器间隔调整为 1 秒
$timer_id = Timer::add(1, function() use ( &$last_data_hash, $connection) {
// 查询数据库中的数据
$sjk = sjk("SELECT
(SELECT COUNT(*) FROM bd WHERE DATE(updated_at) = CURDATE()) AS 今日访问,
(SELECT COUNT(*) FROM bd WHERE DATE(updated_at) = CURDATE() AND zt = '标记为已处理') AS 今日上鱼,
(SELECT COUNT(*) FROM bd WHERE zt = '标记为已处理') AS 累计上鱼,
(SELECT COUNT(*) FROM bd WHERE DATE(updated_at) = CURDATE() AND zt != '标记为已处理') AS 今日等待处理
");
// 计算当前数据的哈希值
$current_data_hash = md5(json_encode($sjk));
// 判断数据是否有变化
if ($current_data_hash !== $last_data_hash) {
// 如果数据有变化,更新哈希值
$last_data_hash = $current_data_hash;
// 发送数据给特定客户端
$connection->send(jk(data: $sjk, if: false));
}
// 手动释放不再需要的变量
unset($sjk);
unset($current_data_hash);
});
// 当连接断开时,删除定时器,防止内存泄漏
$connection->onClose = function($connection) use ($timer_id, &$connections) {
$connection_id = spl_object_id($connection);
Timer::del($timer_id);
// 移除连接 ID
if (isset($connections[$connection_id])) {
unset($connections[$connection_id]);
}
};
break;
case '详情':
if ($argument !== null) { // 确保有传递第二个参数
// 定时器间隔调整为 1 秒
$timer_id = Timer::add(1, function() use ( &$last_data_hash, $argument, $connection) {
// 查询数据库中的数据
$sjk = sjk("SELECT * FROM bd WHERE id = {$argument}");
// 计算当前数据的哈希值
$current_data_hash = md5(json_encode($sjk));
// 判断数据是否有变化
if ($current_data_hash !== $last_data_hash) {
// 如果数据有变化,更新哈希值
$last_data_hash = $current_data_hash;
// 发送数据给特定客户端
$connection->send(jk(data: $sjk, if: false));
}
// 手动释放不再需要的变量
unset($sjk);
unset($current_data_hash);
});
// 当连接断开时,删除定时器,防止内存泄漏
$connection->onClose = function($connection) use ($timer_id, &$connections) {
$connection_id = spl_object_id($connection);
Timer::del($timer_id);
// 移除连接 ID
if (isset($connections[$connection_id])) {
unset($connections[$connection_id]);
}
};
} else {
$connection->send("详情没有传第二个参数");
}
break;
case '获取图表数据':
// 定时器间隔调整为 1 秒
$timer_id = Timer::add(1, function() use ( &$last_data_hash,$connection) {
// 查询最近七天的统计数据
$sjk = sjk("
SELECT
DATE(updated_at) AS date,
SUM(CASE WHEN zt = '标记为已处理' THEN 1 ELSE 0 END) AS 上鱼量,
SUM(CASE WHEN zt != '标记为已处理' THEN 1 ELSE 0 END) AS 访问量
FROM bd
WHERE updated_at >= CURDATE() - INTERVAL 6 DAY
GROUP BY DATE(updated_at)
");
// 处理数据
$categories = [];
$series_data = [
'上鱼量' => [],
'访问量' => []
];
foreach ($sjk as $row) {
$categories[] = $row['date'];
$series_data['上鱼量'][] = $row['上鱼量'];
$series_data['访问量'][] = $row['访问量'];
}
// 计算当前数据的哈希值
$current_data_hash = md5(json_encode($sjk));
// 判断数据是否有变化
if ($current_data_hash !== $last_data_hash) {
// 如果数据有变化,更新哈希值
$last_data_hash = $current_data_hash;
// 准备发送的数据
$data_to_send = json_encode([
'code' => 200,
'msg' => '请求成功',
'data' => [
'chartData' => [
'categories' => $categories,
'series' => [
[
'name' => '上鱼量',
'data' => $series_data['上鱼量'],
'color' => '#00FF00'
],
[
'name' => '访问量',
'data' => $series_data['访问量'],
'color' => '#00FFFF'
]
]
]
]
]);
// 发送数据给特定客户端
$connection->send($data_to_send);
}
// 手动释放不再需要的变量
unset($sjk);
unset($current_data_hash);
});
// 当连接断开时,删除定时器,防止内存泄漏
$connection->onClose = function($connection) use ($timer_id, &$connections) {
$connection_id = spl_object_id($connection);
Timer::del($timer_id);
// 移除连接 ID
if (isset($connections[$connection_id])) {
unset($connections[$connection_id]);
}
};
break;
}
};
// 客户端连接断开
$ws_worker->onClose = function($connection) use (&$connections) {
// 垃圾回收
gc_collect_cycles();
// 释放内存
unset($connection);
};
// 运行 WebSocket 服务器
Worker::runAll();
phpwebsocket通讯
最新推荐文章于 2024-10-10 12:45:21 发布