📅  最后修改于: 2023-12-03 14:50:41.256000             🧑  作者: Mango
有时候,我们需要从后端发送通知给前端。PHP 可以通过与前端之间的 WebSocket 连接来做到这一点。在本篇文章中,我们将介绍如何使用 PHP 和 Swoole 扩展来实现向 PC 发送通知。
首先,我们需要有一个运行 PHP 的服务器,并已经安装了 Swoole 扩展。如果还没有安装,请根据 Swoole 官方文档 进行安装。
我们可以使用 Swoole 的 WebSocket 类来创建 WebSocket 服务。下面就是一个简单的示例代码:
<?php
$server = new Swoole\WebSocket\Server('0.0.0.0', 8080);
$server->on('open', function (Swoole\WebSocket\Server $server, Swoole\Http\Request $request) {
echo "connection open: {$request->fd}\n";
});
$server->on('message', function (Swoole\WebSocket\Server $server, Swoole\WebSocket\Frame $frame) {
echo "received message: {$frame->data}\n";
});
$server->on('close', function (Swoole\WebSocket\Server $server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
这个示例代码创建了一个在 8080 端口监听所有 IP 的 WebSocket 服务。当客户端连接上时,服务端会输出 "connection open";当客户端发来消息时,服务端会输出 "received message";当客户端断开连接时,服务端会输出 "connection close"。
要将通知发送给 PC,我们需要在服务端中保存客户端的 WebSocket 连接对象。我们可以使用一个数组来保存所有连接的客户端。下面是修改后的示例代码:
<?php
$clients = [];
$server = new Swoole\WebSocket\Server('0.0.0.0', 8080);
$server->on('open', function (Swoole\WebSocket\Server $server, Swoole\Http\Request $request) use (&$clients) {
$clients[$request->fd] = $request->fd;
});
$server->on('message', function (Swoole\WebSocket\Server $server, Swoole\WebSocket\Frame $frame) use (&$clients) {
foreach ($clients as $client) {
$server->push($client, $frame->data);
}
});
$server->on('close', function (Swoole\WebSocket\Server $server, $fd) use (&$clients) {
unset($clients[$fd]);
});
$server->start();
这个示例代码中,我们在 $clients
数组中保存了所有的客户端连接。当客户端连接上时,我们将 fd
保存到 $clients
中;当客户端断开连接时,我们从 $clients
中移除该连接。当客户端发送消息时,我们遍历 $clients
数组,并使用 $server->push($client, $frame->data)
将消息发送给每一个客户端。
要运行 WebSocket 服务,只需要将上面的代码保存为 websocket.php
并在终端执行 php websocket.php
即可。服务端会一直运行,直到我们使用 Ctrl + C
组合键将其停止。
最后,在前端页面中,需要使用 JavaScript 来创建一个 WebSocket 连接,来与服务端建立连接并接收通知。下面是一个示例代码:
const ws = new WebSocket('ws://localhost:8080');
ws.onmessage = function (event) {
console.log(event.data);
};
ws.onclose = function () {
console.log('WebSocket closed');
};
在这个示例代码中,我们创建了一个连接到 localhost:8080
的 WebSocket 连接。当服务端发送通知时,我们打印出接收到的数据;当连接关闭时,我们打印出 "WebSocket closed"。
现在,当我们在服务端使用 $server->push()
发送数据时,就可以在前端页面中接收到通知了。
在本篇文章中,我们介绍了如何使用 PHP 和 Swoole 扩展来向 PC 发送通知。我们创建了一个 WebSocket 服务,并在服务端使用 $server->push()
方法来向所有客户端发送通知;在前端中,我们使用 JavaScript 创建了一个 WebSocket 连接来接收通知。我希望这篇文章对你有所帮助。