phpwebsocket通讯

<?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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

php老师傅收徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值