php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据

简介: php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据

websocket.php后端的设置:

  1. php.ini需要开启sockets扩展;
  2. websocket需要CLI(命令行工具)启动服务端文件服务:php websocket.php


  1. websocket.php代码
$address = "127.0.0.1";
$port = 9090; //调试的时候,可以多换端口来测试程序!
set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_block($sock);
socket_bind($sock, $address, $port);
socket_listen($sock, 4);
do {
    echo "Waiting for Connection...\n";
    $msgsock = socket_accept($sock);
    echo "Waiting for Request...\n";
    $buf = socket_read($msgsock, 8192);//读取请求
    echo "Request Received: $buf\n";
    $response = hand_shake($buf);
    socket_write($msgsock, $response, strlen($response)); //发送响应
    //开始通信...
    $buf = socket_read($msgsock, 8192); //获取前端发送的消息
    //返回json数据;
    if (unmask($buf) == 'getPeerInfo') {
        $msg = '[
        {
            "vid": "1",
            "vname": "杨过",
            "vdata": "20.00",
            "vtask": "70.00"
        },
        {
            "vid": "2",
            "vname": "小龙女",
            "vdata": "40.00",
            "vtask": "100.00"
        },
        {
            "vid": "3",
            "vname": "郭靖",
            "vdata": "40.00",
            "vtask": "100.00"
        },
        {
            "vid": "4",
            "vname": "黄蓉",
            "vdata": "30.00",
            "vtask": "100.00"
        },
        {
            "vid": "5",
            "vname": "欧阳锋",
            "vdata": "90.00",
            "vtask": "100.00"
        },
        {
            "vid": "6",
            "vname": "洪七公",
            "vdata": "90.00",
            "vtask": "100.00"
        },
        {
            "vid": "7",
            "vname": "黄老邪",
            "vdata": "68.00",
            "vtask": "90.00"
        },
        {
            "vid": "8",
            "vname": "一灯大师",
            "vdata": "30.00",
            "vtask": "79.00"
        },
        {
            "vid": "9",
            "vname": "老顽童",
            "vdata": "89.00",
            "vtask": "98.00"
        },
        {
            "vid": "10",
            "vname": "郭襄",
            "vdata": "69.00",
            "vtask": "96.00"
        }]';
        $response_text = mask($msg);
        socket_write($msgsock, $response_text, strlen($response_text));
    } else {
        //这里不建议用array,因为json_encode之后出现空值,可能是编码问题。
        //一旦编码出问题,就是返回空,又不报错
        $msg = '{"error:"Invalid method"}';
        $response_text = mask(json_encode($msg));
        socket_write($msgsock, $response_text, strlen($response_text));
    };
    socket_close($msgsock);
} while (true);
socket_close($sock);
function hand_shake($buf)
{
    $buf = substr($buf, strpos($buf, 'Sec-WebSocket-Key:') + 18);
    $key = trim(substr($buf, 0, strpos($buf, "\r\n")));
    $new_key = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
    $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
    $new_message .= "Upgrade: websocket\r\n";
    $new_message .= "Sec-WebSocket-Version: 13\r\n";
    $new_message .= "Connection: Upgrade\r\n";
    $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
    return $new_message;
}
//解码数据
function unmask($text)
{
    $length = ord($text[1]) & 127;
    if ($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    } elseif ($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    } else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    return $text;
}
function mask($text)
{
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);
    if ($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif ($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif ($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header . $text;
}


亟需解决的三个问题:

  1. 如何保持websocket的长连接;
  2. 如何让websocket自动推送信息;
  3. 如何websocket连接MySql数据库;

Done!

相关文章
|
2月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
|
2月前
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
|
3月前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。 isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。
|
6月前
|
数据采集 JSON JavaScript
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
本文介绍了如何使用PHP模拟表单提交并结合代理IP技术抓取京东商品的实时名称和价格,特别是在电商大促期间的数据采集需求。通过cURL发送POST请求,设置User-Agent和Cookie,使用代理IP绕过限制,解析返回数据,展示了完整代码示例。
123 3
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
|
6月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
108 5
|
2月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
149 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
23天前
|
前端开发 JavaScript 关系型数据库
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
58 5
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
|
5月前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
146 6
|
19天前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
83 11
|
29天前
|
人工智能 小程序 NoSQL
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。