javascript - 使用 SSE 获取 mysql select 的响应

标签 javascript php mysql server-sent-events eventsource

我正在尝试使用 EventSource 创建实时连接聊天 1 对 1。我设置了事件源,根据开发人员工具告诉我的内容,它是打开的并且可以工作,但是响应数据没有显示在PHP文件。

PHP:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

session_start(); // Starting Session
include 'dbconnect.php';
include 'Session.php';

$messageuserid = $_GET['messageuserid'];

$RunSqlGM = "SELECT * FROM messages WHERE (SUsername = '$Session_Username' AND RUsername = '$messageuserid') OR (SUsername = '$messageuserid' AND RUsername = '$Session_Username')";
$getmessagethread = mysqli_query($con,$RunSqlGM)or die(mysqli_error());

while($MessageRows = mysqli_fetch_array($getmessagethread)) {
    $MSUsername = $MessageRows['SUsername'];
    $MRUsername = $MessageRows['RUsername'];
    $MSender = $MessageRows['Sender'];
    $MessageContent = $MessageRows['Message'];
    $TimeStamp = date("g:ia \o\\n l jS F Y", strtotime($MessageRows["Time"]));


    if ($MSender === $Session_Username) {
        echo "<table class='messagebubbleright'>";
            echo "<tr><th></th></tr>";
            echo "<tr>";
                echo "<td class='inforight'>$MSender<br>$TimeStamp</td>";
            echo "</tr>";
            echo "<tr>";
                echo "<td class='bubbleright'>$MessageContent</td>";
            echo "</tr>";
        echo "</table>";
        flush();
    } else {
        echo "<table class='messagebubbleleft'>";
            echo "<tr><th></th></tr>";
            echo "<tr>";
                echo "<td class='infoleft'>$MSender<br>$TimeStamp</td>";
            echo "</tr>";
            echo "<tr>";
                echo "<td class='bubbleleft'>$MessageContent</td>";
            echo "</tr>";
        echo "</table>";
        flush();
    }
}
mysqli_close($con); // Connection Closed
?>

并且调用事件源的js包含在这个通过点击按钮启动的函数中。

JS:

function GetMessages(GetMUserID) {
    if (typeof(EventSource) !== "undefined") {
        var source = new EventSource("db/getmessages.php?messageuserid=" + GetMUserID);
        source.addEventListener("open", function() {
            $("#readmessagearea").html("Getting server updates");
        });

        source.addEventListener("message", function(event) {
            $("#readmessagearea").html(event.data);
        });

    } else {
        $("#readmessagearea").html("Sorry, your browser does not support server-sent events...");
    }
}

如有任何帮助或指导,我们将不胜感激。我对 SSE 比较陌生,但据我所知,这应该可行。

最佳答案

您的 PHP 代码存在一些问题。比较容易修复的是最好将flush()改成@ob_flush();@flush()ob_flush() 确保 PHP 没有缓冲任何东西,而 @ 标志只是确保在没有使用缓冲时您不会收到警告消息。

第二个问题是 SSE 协议(protocol)是最小的,但不是那个最小的!您需要在消息前加上“data:”前缀,并在后缀上加上“\n\n”。您的 HTML 本身不包含任何换行符,因此我认为它会起作用。 (除非 $MessageContent 或任何其他动态数据中有换行...我建议不仅对回车符进行一些数据过滤,而且还对 HTML 标记进行过滤,因为您当前的代码是容易受到嵌入式 HTML 攻击。)

另一种方法:另一种方法是只发送一个 JSON 对象,其中包含 $MessageRows["Time"]$MSender$MessageContent 等,并让 JavaScript 客户端创建 HTML。这更加灵活(例如,不同国家/地区的客户可以拥有自己的日期戳格式,可以更改布局等,而无需接触后端),但将更多工作移至前端。

关于javascript - 使用 SSE 获取 mysql select 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41709748/

相关文章:

php - CentOS 中更新的 PHP 7 环境的 VirtualMin 安装错误

mysql - 非重复计数查询

javascript - Jquery 滚动到 ID 或 anchor - 如果已经存在则滚动到顶部?

php - CodeIgniter Active Record 的批处理 "replace into"

来自 MySQL 的带有类别名称的 php 递归面包屑

mysql - 从 MySQL 到 NoSQL 键值存储的数据同步

javascript - 使用 express 和 javascript 将 mysql 读取到网页

javascript - 奥里利亚导航管道

javascript - jQuery onclick 仅更改最近的 div 的 html

javascript - Meteor 服务器在 Meteor 方法中使用 Accounts.addEmail() 抛出错误