php实现websocket实时消息推送

yizhihongxing

下面是详细讲解“php实现websocket实时消息推送”的完整攻略。

什么是Websocket

Websocket是HTML5一种新协议,实现了浏览器与服务器全双工通信,让服务器能够主动向客户端推送内容。相比传统的HTTP协议,Websocket具有更高效、更实时的特点,适合用于需要实时交互和通信的场景,如在线聊天、在线游戏等。

基本原理

Websocket协议本质上是一个基于TCP的协议。在建立Websocket连接时,客户端先通过HTTP请求与服务器协商升级协议,然后通信双方就直接建立起了TCP连接进行全双工通信。

使用PHP实现Websocket

可以使用PHP的swoole扩展来实现Websocket,利用swoole提供的swoole_websocket_server类,就可以快速搭建一个Websocket服务器。

下面是具体的实现步骤:

1、安装swoole扩展

可以使用以下命令来安装swoole扩展:

pecl install swoole

2、创建Websocket服务器

使用下面的代码可以创建一个Websocket服务器:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9501);
$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "client {$request->fd} connected\n";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "received message: {$frame->data}\n";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});
$server->on('close', function (swoole_websocket_server $server, $fd) {
    echo "client {$fd} closed\n";
});
$server->start();

以上代码创建了一个Websocket服务器,监听9501端口。当有一个客户端连接进来时,会执行open事件回调函数,打印出客户端的ID。当客户端发送消息时,会执行message事件回调函数,打印出消息内容并返回一个["hello", "world"]数组给客户端。当客户端关闭连接时,会执行close事件回调函数,打印出客户端的ID。

3、启动服务器

使用以下命令可以启动Websocket服务器:

php websocket.php

4、使用客户端测试

可以使用WebSocket客户端工具来进行测试,例如Chrome浏览器的Simple WebSocket Client插件。连接到刚才启动的Websocket服务器,并发送一条消息,就可以看到服务器返回的消息了。

5、添加自己的逻辑

以上示例只是演示了如何启动一个Websocket服务器,实际应用中需要根据业务需求添加自己的逻辑。比如,可以在open事件回调函数中保存连接对象,以便后续在message事件回调函数中使用;在message事件回调函数中可以对接收到的消息进行解析和处理,并返回对应的结果;等等。

示例一:Websocket实现简单聊天室

下面是一个使用Websocket实现简单聊天室的示例代码:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9501);

$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "client {$request->fd} connected\n";
});

$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "received message: {$frame->data}\n";
    $data = json_decode($frame->data, true);
    $message = [
        'type' => 'chat',
        'time' => date('Y-m-d H:i:s'),
        'username' => $data['username'],
        'content' => $data['content']
    ];
    foreach ($server->connections as $fd) {
        $server->push($fd, json_encode($message));
    }
});

$server->on('close', function (swoole_websocket_server $server, $fd) {
    echo "client {$fd} closed\n";
});

$server->start();

以上代码实现了一个简单的聊天室,当有客户端连接进来时,会在服务端打印出连接信息,当客户端发送消息时,服务端会将消息发送给所有连接进来的客户端。消息格式为:

{
    "type": "chat",
    "time": "2021-09-10 10:00:00",
    "username": "xxx",
    "content": "xxx"
}

可以用以下html代码来测试:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
</head>
<body>
<p>用户名:<input type="text" id="username"></p>
<p>消息:<input type="text" id="message"></p>
<p><button onclick="send()">发送</button></p>
<div id="messages"></div>
<script>
    var ws = new WebSocket("ws://localhost:9501");
    ws.onopen = function(event) {
        console.log("WebSocket已连接上");
    }
    ws.onmessage = function(event) {
        var message = JSON.parse(event.data);
        if (message.type == 'chat') {
            var html = '<p>[' + message.time + '] ' + message.username + ' 说:' + message.content + '</p>';
            document.getElementById('messages').innerHTML += html;
        }
    }
    function send() {
        var username = document.getElementById('username').value;
        var message = document.getElementById('message').value;
        var data = {
            username: username,
            content: message
        };
        ws.send(JSON.stringify(data));
        document.getElementById('message').value = '';
    }
</script>
</body>
</html>

示例二:Websocket实现实时股票行情推送

下面是一个使用Websocket实现实时股票行情推送的示例代码:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9501);

$data = [
    '000001.SZ' => 10.00,
    '000002.SZ' => 12.00,
    '000003.SZ' => 8.00
];

$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "client {$request->fd} connected\n";
});

$server->on('message', function (swoole_websocket_server $server, $frame) use ($data) {
    echo "received message: {$frame->data}\n";
    $message = [
        'type' => 'stock',
        'data' => []
    ];
    $stocks = explode(',', $frame->data);
    foreach ($stocks as $stock) {
        $price = isset($data[$stock]) ? $data[$stock] : rand(1, 20);
        $message['data'][$stock] = $price;
    }
    $server->push($frame->fd, json_encode($message));
});

$server->on('close', function (swoole_websocket_server $server, $fd) {
    echo "client {$fd} closed\n";
});

$server->start();

以上代码实现了一个实时股票行情推送的服务端程序,当有客户端连接进来时,会在服务端打印出连接信息,当客户端发送股票代码时,服务端会随机生成股票价格并返回给客户端。消息格式为:

{
    "type": "stock",
    "data": {
        "000001.SZ": 10.00,
        "000002.SZ": 12.00,
        "000003.SZ": 8.00
    }
}

可以用以下html代码来测试:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>实时股票行情</title>
</head>
<body>
<p>股票代码:<input type="text" id="stocks"></p>
<p><button onclick="subscribe()">订阅</button></p>
<div id="prices"></div>
<script>
    var ws = new WebSocket("ws://localhost:9501");
    ws.onopen = function(event) {
        console.log("WebSocket已连接上");
    }
    ws.onmessage = function(event) {
        var message = JSON.parse(event.data);
        if (message.type == 'stock') {
            var html = '<ul>';
            for (var stock in message.data) {
                var price = message.data[stock].toFixed(2);
                html += '<li>' + stock + ': ' + price + '</li>';
            }
            html += '</ul>';
            document.getElementById('prices').innerHTML = html;
        }
    }
    function subscribe() {
        var stocks = document.getElementById('stocks').value;
        ws.send(stocks);
    }
</script>
</body>
</html>

以上就是使用PHP实现Websocket实时消息推送的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现websocket实时消息推送 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PHP实现的创建带logo图标二维码生成类详解

    PHP实现的创建带logo图标二维码生成类详解 简介 二维码(QR Code)是应用于电子设备中的一种条码。它以矩阵和黑白两色的方式来记录数据信息,具有信息容量大、安全性高、易于读取等特点,是目前应用非常广泛的一种图形码。本文介绍了在PHP中创建带logo图标的二维码生成类的实现方法,可以用于实现在网站中生成二维码并带有自定义logo。 实现步骤 1. 导入…

    PHP 2023年5月26日
    00
  • PHP获取学生成绩的方法

    学生成绩是学生教育中最重要的记录之一。对于学校、老师和学生自身,准确地记录和获取学生成绩是非常重要的。在教育管理系统、班级管理系统等网站中,获取学生成绩的方法也是一个必要的功能。下面,我们就来讲解如何用PHP获取学生成绩的方法。 获取学生成绩的前提 在获取学生成绩之前,我们需要先明确以下两个重要前提: 1. 数据库中存储学生成绩的结构 学生成绩的数据结构是通…

    PHP 2023年5月26日
    00
  • php生成静态html页面的方法(2种方法)

    生成静态HTML页面是提升网站性能和搜索引擎优化的常用手段。下面介绍两种使用PHP生成静态HTML页面的方法。 方法一:使用ob_start()和ob_get_contents()函数 使用ob_start()和ob_get_contents()函数可以将PHP页面内容读取到缓存中,最后再将内容输出到HTML文件中,即可生成静态HTML页面。 示例代码: &…

    PHP 2023年5月26日
    00
  • PHP中大括号'{}’用法实例总结

    谢谢您的提问,我很乐意为您讲解PHP中大括号'{}’用法实例总结。 什么是PHP中大括号'{}’? 在PHP中,花括号“{}”一般用于分隔语句块,可以帮助我们组织代码和进行条件判断等操作。在控制语句(如 if、for、while 等)的使用中,大括号也经常被用来定义程序块,实现多条语句的一起执行。 大括号的用法示例 示例一:在字符串中使用大括号 当我们需要向…

    PHP 2023年5月26日
    00
  • php 输出双引号”与单引号’的方法

    当使用PHP时,我们常常需要在HTML中嵌入字符串,以便将变量或其他动态内容显示到用户界面上。在这种情况下,我们需要使用PHP的输出功能。双引号和单引号是两种常用的字符串格式,可以根据具体使用场景选择不同的输出方法。 输出双引号 如果字符串中包含变量或特殊字符,应使用双引号来输出字符串。双引号允许我们使用变量插入和转义序列,而单引号则不允许。以下两个示例演示…

    PHP 2023年5月26日
    00
  • php计算多个集合的笛卡尔积实例详解

    PHP计算多个集合的笛卡尔积实例详解 什么是笛卡尔积 笛卡尔积,又称直积,是在数学中用于组合两个集合的方法。笛卡尔积的结果是一个新的集合,该集合中的每个元素都是由两个原始集合中的一个元素组成的有序对。 举一个简单的例子:假设有两个集合,分别为A={a,b,c}和B={x,y},则A和B的笛卡尔积为: A × B = {(a,x),(a,y),(b,x),(b…

    PHP 2023年5月26日
    00
  • php禁用函数设置及查看方法详解

    PHP禁用函数设置及查看方法详解 什么是PHP禁用函数? PHP禁用函数是指在PHP配置文件中将某些函数禁用掉。当我们在使用PHP编写Web应用时,为了保证应用的安全性,我们可能需要限制某些函数的使用,这就需要进行PHP禁用函数设置。 如何设置PHP禁用函数? PHP禁用函数的设置需要修改PHP配置文件php.ini中的配置项,因此需要有管理员权限。而一些虚…

    PHP 2023年5月26日
    00
  • php实现的MySQL通用查询程序

    下面我将详细讲解“php实现的MySQL通用查询程序”的完整攻略。 1. 准备工作 在开始编写php实现的MySQL通用查询程序之前,我们需要进行一些准备工作: 安装PHP和MySQL:在开始编写代码之前,你需要先安装好PHP和MySQL。如果你还没有安装,可以根据你的操作系统,自行查找安装教程。 创建数据库和数据表:我们需要创建一个测试的数据库,用于测试查…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部