使用 SSE 获取 mysql select 的响应
Getting response of mysql select with SSE
我正在尝试使用 EventSource 创建一对一的实时连接聊天。我已经设置了事件源,从开发人员工具告诉我的内容来看,它是打开的并且可以工作,但是没有显示响应数据来自 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协议是最小的,但不是那个最小的!您需要在消息前加上 "data:" 前缀,并在其后缀上“\n\n”。您的 HTML 不包含任何换行符,所以我认为它会起作用。 (除非 $MessageContent
或任何其他动态数据中有换行...我建议不仅对 carriage-returns,而且对 HTML 标签进行一些数据过滤,作为您当前的代码容易受到嵌入式 HTML 攻击。)
另一种方法:另一种方法是只发送一个 JSON 对象,其中包含 $MessageRows["Time"]
、$MSender
、$MessageContent
,等等,并让 JavaScript 客户端创建 HTML。这更灵活(例如,不同国家/地区的客户可以拥有自己的日期戳格式,可以更改布局等,而无需触摸 back-end),但将更多工作移至 front-end。
我正在尝试使用 EventSource 创建一对一的实时连接聊天。我已经设置了事件源,从开发人员工具告诉我的内容来看,它是打开的并且可以工作,但是没有显示响应数据来自 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协议是最小的,但不是那个最小的!您需要在消息前加上 "data:" 前缀,并在其后缀上“\n\n”。您的 HTML 不包含任何换行符,所以我认为它会起作用。 (除非 $MessageContent
或任何其他动态数据中有换行...我建议不仅对 carriage-returns,而且对 HTML 标签进行一些数据过滤,作为您当前的代码容易受到嵌入式 HTML 攻击。)
另一种方法:另一种方法是只发送一个 JSON 对象,其中包含 $MessageRows["Time"]
、$MSender
、$MessageContent
,等等,并让 JavaScript 客户端创建 HTML。这更灵活(例如,不同国家/地区的客户可以拥有自己的日期戳格式,可以更改布局等,而无需触摸 back-end),但将更多工作移至 front-end。