使用 PHP 和 WebSockets 或 SSE 实现实时通知

问题描述 投票:0回答:1

我正在为 CRM 开发实时消息传递功能,需要帮助将通知推送到前端,而无需频繁的数据库查询,这可能会增加服务器和数据库负载。

目前,我设置了一个 webhook,用于使用 PHP 将 SMS 消息插入 MySQL 数据库,如下所示:

if (isset($_POST['From']) && isset($_POST['Body'])) {
    $stmt = $pdo->prepare('INSERT INTO sms_messages (`number`, message) VALUES (:number, :message');
    $stmt->execute([
        'number' => $_POST['From'],
        'message' => $_POST['Body'],
    ]);

    // Function to send notification to client needed here.
}

我想使用 JavaScript 将这些通知直接转发到我的客户端前端,而无需不断轮询。我有一些使用 Ratchet 在 PHP 中处理 WebSocket 的经验,但不确定如何将上述 PHP 事件与 WebSocket 集成以实时通知客户端。

这是我的基本 WebSocket 服务器设置:

require 'vendor/autoload.php';
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat implements MessageComponentInterface {
    public function onOpen(ConnectionInterface $conn) {
        echo "New connection! ({$conn->resourceId})\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        echo sprintf('New message from %d: %s'."\n", $from->resourceId, $msg);
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Connection {$conn->resourceId} has disconnected\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "An error has occurred: {$e->getMessage()}\n";
        $conn->close();
    }
}

$server = IoServer::factory(new HttpServer(new WsServer(new Chat())), 8080);
$server->run();

以及客户端相应的JavaScript:

var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function(e) {
    console.log("Connection established!");
    conn.send('Hello, World!');
};

conn.onmessage = function(e) {
    console.log(e.data);
};

conn.onerror = function(e) {
    console.error("Connection failed!", e);
};

function sendMessage(message) {
    if (conn.readyState === WebSocket.OPEN) {
        conn.send(message);
    } else {
        console.log("WebSocket is not open. ReadyState: " + conn.readyState);
    }
}

setTimeout(function() { sendMessage('Hello again!'); }, 1000);

我也在考虑将服务器端事件 (SSE) 作为替代方案,但与 WebSocket 一样,我不确定如何在不定期数据库检查的情况下进行设置。任何关于如何使用 WebSockets 或 SSE 或任何其他建议方法有效地将事件从 PHP 实时推送到 JavaScript 的指南将不胜感激。

php websocket ratchet
1个回答
0
投票

请查看 Ratchet 文档的推送到现有站点部分。我相信它准确地描述了您的需求。

基本上,在插入已实现的新数据库记录时,您还需要将相同的数据推送到ZeroMQ,然后 Ratchet 将在其主循环中读取该数据并将其广播到所有连接的推送客户端。

因此,您的推送客户端在接收推送通知时不会给数据库带来负载,并且每个通知仅通过 ZeroMQ 进行一次数据交换。这将是一个相当有效的设计。

© www.soinside.com 2019 - 2024. All rights reserved.