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!

相关文章
|
1月前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
17天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
18 1
|
23天前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
35 6
|
20天前
|
PHP 开发者 UED
探索PHP中的异常处理:提升代码的健壮性
在PHP开发中,优雅地处理错误和异常是确保应用稳定性和用户体验的关键。本文将通过深入浅出的方式,介绍如何在PHP中实现有效的异常处理机制,包括异常的基本概念、如何抛出和捕获异常,以及最佳实践。准备好让你的代码变得更加健壮和可靠吧!
18 2
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
1月前
|
PHP 开发者
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第40天】在PHP编程中,异常处理是确保应用稳定性的关键。本文将引导你理解异常处理的重要性,掌握如何在PHP中捕获和处理异常,以及如何通过自定义异常类来增强代码的错误管理能力。我们将一起探索如何利用PHP的异常处理机制,打造一个更加健壮和可靠的应用程序。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
11天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
36 4
|
2天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
21 3
|
17天前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。