下面是详细讲解“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技术站