php实现websocket实时消息推送

下面是详细讲解“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服务器验证实例详解

    我很乐意为您详细讲解“微信小程序消息推送PHP服务器验证实例详解”。首先,我们需要了解消息推送的基本原理。 消息推送旨在解决两个问题:实时通知和信息更新。通过消息推送,我们可以在没有打开小程序的情况下,第一时间获取到有关小程序的更新或重要信息提醒。 下面,我会详细介绍如何通过PHP服务器进行消息推送。 步骤一:准备工作 为了实现消息推送,我们需要完成以下准备…

    PHP 2023年5月30日
    00
  • 微信小程序实现图片选择并预览功能

    下面是实现微信小程序图片选择并预览的攻略: 1. 准备工作 首先,需要在小程序的app.json文件中进行设置,具体如下: { "pages": [ "pages/index/index" // 设置小程序的首页 ], "window": { "backgroundColor":…

    PHP 2023年5月30日
    00
  • PHP中文URL编解码(urlencode()rawurlencode()

    对中文URL进行编解码是Web开发中的一个常见需求。在PHP中,提供了两个函数来完成这个任务:urlencode和rawurlencode。下面详细讲解这两个函数的用法和区别。 urlencode urlencode函数是PHP内置函数,用于将URL中的非字母数字字符以及一些保留字符进行编码,以便于在URL传递时能够正确地传递参数。 语法:string ur…

    PHP 2023年5月23日
    00
  • php实现中文字符截取防乱码方法汇总

    PHP实现中文字符截取防乱码方法汇总 中文字符在PHP中截取常会出现乱码的问题。本篇文章总结了几种避免中文字符截取乱码问题的方法。 方法一:使用mb_substr()函数 mb_substr()函数是PHP中专门用于截取带有多字节字符集的字符串的函数。该函数会根据指定的字符集(UTF-8、GBK等)进行字符截取,从而避免出现乱码问题。 $originalSt…

    PHP 2023年5月26日
    00
  • 微信小程序 PHP生成带参数二维码

    下面是微信小程序 PHP生成带参数二维码的完整攻略。 1. 需要准备的材料 微信小程序 AppID 和 AppSecret PHP 后端服务器 PHP 生成二维码的库和扩展 微信开放平台的 access_token 2. 如何获取 access_token 在访问微信公众平台的接口前,需要先获取 access_token。可以通过以下步骤获取 access_…

    PHP 2023年5月23日
    00
  • 微信小程序如何修改本地缓存key中单个数据的详解

    当我们使用微信小程序进行开发时,一般会把需要频繁调用的数据缓存在本地。缓存数据的时候,往往使用wx.setStorageSync()和wx.getStorageSync()方法,这些方法需要传入一个本地缓存key和相应的value。如果想要单独修改本地缓存中key对应的值,可以使用以下的方法: 1. 获取本地缓存数据并修改其中的某个值 // 定义一个缓存数据…

    PHP 2023年5月30日
    00
  • PHP CLI模式下的多进程应用分析

    PHP CLI模式下的多进程应用可以通过PHP的pcntl和posix扩展来实现。本攻略将介绍如何使用这两个扩展来实现多进程的应用。 安装pcntl和posix扩展 PHP CLI模式默认不包含pcntl和posix扩展,需要手动安装。下面是安装命令的参考样例: Debian / Ubuntu sudo apt-get install php-pcntl s…

    PHP 2023年5月27日
    00
  • 微信小程序结合ThinkPHP5授权登陆后获取手机号

    下面给出详细的攻略,分为以下几个步骤: 获取微信小程序用户的授权信息。 发送授权凭证code到后端服务器,获取session_key和openid。 利用session_key和encryptedData解密用户敏感数据(如手机号等)。 步骤一:获取微信小程序用户的授权信息 在小程序端,可以通过wx.login函数获取用户授权凭证code,示例代码如下: w…

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