如何查看有关服务器发送事件的错误?
How to see errors about server sent events?
我使用 HTML5 Server Sent Events 对一个网站进行了编码,它在 Godaddy 共享主机上运行得非常好,但是具有完全相同代码的同一个站点在 101domain 共享主机上无法运行。
除了使用 Server Sent Events 的聊天功能外,其余一切工作正常。
如何查找脚本中的错误。
这是 HTML 页面,带有 SSE javascript 代码。
<?php
$get_value_this_url = "globalchat";
?>
<div id="chat">
<div id="chats-div">
<p id="tip">(tip! kickstart a discussion by sharing this page)</p>
<ul id="chats-ul">
<?php
/*This session id will be used to fetch the latest chat via SSE*/
$_SESSION["id"] = 1;
if($stmt = $con->prepare("SELECT `icicinbbcts_id`, `icicinbbcts_user`, `icicinbbcts_chats` FROM `icicinbbcts_chats` WHERE `icicinbbcts_video_id` = ? ORDER BY `icicinbbcts_id` DESC LIMIT 25")){
$stmt->bind_param("s", $video_id);
$video_id = $get_value_this_url;
if ($stmt->execute()) {
$stmt->bind_result($id, $user, $chats);
$stmt->store_result();
if($stmt->num_rows() > 0){
$_SESSION["offset"] = $stmt->num_rows;
}
while ($stmt->fetch()) {
//print_r($user .": ". $chats."<br>");
echo '<li class="chats"><span id="nicknameChats">'.$user.'</span>: '.$chats.'</li>';
//echo '<span class="line-spacing"></span>';
$_SESSION["offset"] = $stmt->num_rows;
if($_SESSION["id"] < $id){
$_SESSION["id"] = $id;
}
}
}else
echo $stmt->error;
}else
echo $stmt->error;
$stmt->free_result();
$stmt->close();
?>
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("auto_update.php?r=<?php echo $get_value_this_url; ?>");
source.onmessage = function(event) {
var obj = JSON.parse(event.data);
$("#chats-ul").append('<li class="chats"><span id="nicknameChats">'+obj.user+'</span>: '+obj.chats+'</li>');
$('#chats-ul').scrollTop($(window).height());
};
} else {
document.getElementById("chats-ul").innerHTML = "Your browser doesn't support a part of HTML5, so please use modern browsers like Chrome, Firefox, etc.";
}
</script>
</ul>
</div>
<input id="text-area" class="q" name="text-input" form="textForm" maxlength="140" placeholder="Type to comment" ></input>
</div>
这是服务器端 PHP 脚本。
<?php session_start(); ?>
<?php //error_reporting(E_ALL); ?>
<?php require "connection.php";?>
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if($stmt = $con->prepare("SELECT `icicinbbcts_id`, `icicinbbcts_user`, `icicinbbcts_chats` FROM `icicinbbcts_chats` WHERE `icicinbbcts_video_id` = ? AND `icicinbbcts_id` > ? ORDER BY `icicinbbcts_id` DESC")){
$stmt->bind_param("si", $video_id, $row_id);
$row_id = $_SESSION["id"];
$video_id = mysqli_real_escape_string($con, strip_tags($_GET["r"]));
if ($stmt->execute()) {
$stmt->bind_result($id, $user, $chats);
$stmt->store_result();
if($stmt->num_rows > 0){
while ($row = $stmt->fetch()) {
if($_SESSION["id"] < $id){
$send = array("user" => $user, "chats" => $chats);
echo "retry: 100\n";
echo "data: ".json_encode($send)."\n\n";
ob_end_flush();
flush();
$_SESSION["id"] = $id;
}
}
}
}else
echo $stmt->error;
}else
echo $stmt->error;
$stmt->close();
?>
上面的相同代码在 Godaddy 共享主机上完美运行,但是保存代码在 101domain 上不起作用。
我尝试在 PHP 和 HTML 中添加字符集 UTF-8,但没有用,我尝试在服务器端 PHP 脚本中添加 ob_flush它也没有帮助。
connection.php 没有问题,因为相同的文件在其他页面上工作正常。
在聊天功能上,聊天消息被插入到数据库中,但它不会显示在页面上,除非我们刷新页面。
如何检查错误以及如何调试 Server Sent Events?
+++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++
我在 console.log 中找到了 chrome 中的登录,当我将 console.log 代码放在代码中下面显示的位置时。
<script>
if(typeof(EventSource) !== "undefined") {
console.log("SSE is supported"); //placing console.log here, displays the message in chrome developer tool
var source = new EventSource("auto_update.php?r=<?php echo $get_value_this_url; ?>");
source.onmessage = function(event) {
console.log("message isn't received from server"); //placing console.log here doesn't display any log message in Chrome Developer Tool
var obj = JSON.parse(event.data);
$("#chats-ul").append('<li class="chats"><span id="nicknameChats">'+obj.user+'</span>: '+obj.chats+'</li>');
$('#chats-ul').scrollTop($(window).height());
};
} else {
document.getElementById("chats-ul").innerHTML = "Your browser doesn't support a part of HTML5, so please use modern browsers like Chrome, Firefox, etc.";
}
</script>
所以从上面的console.log,我们看到SSE脚本没有从后端接收消息,后端代码如上所示,你能指出后端代码有什么问题吗?
您想报告错误吗?
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
由于它只适用于一个提供商而不适用于另一个提供商,因此可能是服务器配置问题。
您可以尝试通过以下方式缩小问题范围:
- 在 javascript 脚本中使用
console.log(event)
检查您是否从服务器获取任何内容
- 检查浏览器开发人员工具区域中的网络选项卡(在Chrome中选择其他以查看服务器发送的事件)。
如果没有输出,请尝试缩小服务器上的问题范围。尽早解析 SSE 输出以查看 SSE 机制是否有效。一点一点地解决 SSE,直到它崩溃。如果提供商之间的特定线路存在差异,则可能是由于 PHP 版本。在 php 文件中比较 php 版本 运行 <?php phpinfo() ?
。
如果您发现差异,请联系您的供应商!
我使用 HTML5 Server Sent Events 对一个网站进行了编码,它在 Godaddy 共享主机上运行得非常好,但是具有完全相同代码的同一个站点在 101domain 共享主机上无法运行。 除了使用 Server Sent Events 的聊天功能外,其余一切工作正常。
如何查找脚本中的错误。
这是 HTML 页面,带有 SSE javascript 代码。
<?php
$get_value_this_url = "globalchat";
?>
<div id="chat">
<div id="chats-div">
<p id="tip">(tip! kickstart a discussion by sharing this page)</p>
<ul id="chats-ul">
<?php
/*This session id will be used to fetch the latest chat via SSE*/
$_SESSION["id"] = 1;
if($stmt = $con->prepare("SELECT `icicinbbcts_id`, `icicinbbcts_user`, `icicinbbcts_chats` FROM `icicinbbcts_chats` WHERE `icicinbbcts_video_id` = ? ORDER BY `icicinbbcts_id` DESC LIMIT 25")){
$stmt->bind_param("s", $video_id);
$video_id = $get_value_this_url;
if ($stmt->execute()) {
$stmt->bind_result($id, $user, $chats);
$stmt->store_result();
if($stmt->num_rows() > 0){
$_SESSION["offset"] = $stmt->num_rows;
}
while ($stmt->fetch()) {
//print_r($user .": ". $chats."<br>");
echo '<li class="chats"><span id="nicknameChats">'.$user.'</span>: '.$chats.'</li>';
//echo '<span class="line-spacing"></span>';
$_SESSION["offset"] = $stmt->num_rows;
if($_SESSION["id"] < $id){
$_SESSION["id"] = $id;
}
}
}else
echo $stmt->error;
}else
echo $stmt->error;
$stmt->free_result();
$stmt->close();
?>
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("auto_update.php?r=<?php echo $get_value_this_url; ?>");
source.onmessage = function(event) {
var obj = JSON.parse(event.data);
$("#chats-ul").append('<li class="chats"><span id="nicknameChats">'+obj.user+'</span>: '+obj.chats+'</li>');
$('#chats-ul').scrollTop($(window).height());
};
} else {
document.getElementById("chats-ul").innerHTML = "Your browser doesn't support a part of HTML5, so please use modern browsers like Chrome, Firefox, etc.";
}
</script>
</ul>
</div>
<input id="text-area" class="q" name="text-input" form="textForm" maxlength="140" placeholder="Type to comment" ></input>
</div>
这是服务器端 PHP 脚本。
<?php session_start(); ?>
<?php //error_reporting(E_ALL); ?>
<?php require "connection.php";?>
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if($stmt = $con->prepare("SELECT `icicinbbcts_id`, `icicinbbcts_user`, `icicinbbcts_chats` FROM `icicinbbcts_chats` WHERE `icicinbbcts_video_id` = ? AND `icicinbbcts_id` > ? ORDER BY `icicinbbcts_id` DESC")){
$stmt->bind_param("si", $video_id, $row_id);
$row_id = $_SESSION["id"];
$video_id = mysqli_real_escape_string($con, strip_tags($_GET["r"]));
if ($stmt->execute()) {
$stmt->bind_result($id, $user, $chats);
$stmt->store_result();
if($stmt->num_rows > 0){
while ($row = $stmt->fetch()) {
if($_SESSION["id"] < $id){
$send = array("user" => $user, "chats" => $chats);
echo "retry: 100\n";
echo "data: ".json_encode($send)."\n\n";
ob_end_flush();
flush();
$_SESSION["id"] = $id;
}
}
}
}else
echo $stmt->error;
}else
echo $stmt->error;
$stmt->close();
?>
上面的相同代码在 Godaddy 共享主机上完美运行,但是保存代码在 101domain 上不起作用。
我尝试在 PHP 和 HTML 中添加字符集 UTF-8,但没有用,我尝试在服务器端 PHP 脚本中添加 ob_flush它也没有帮助。
connection.php 没有问题,因为相同的文件在其他页面上工作正常。 在聊天功能上,聊天消息被插入到数据库中,但它不会显示在页面上,除非我们刷新页面。
如何检查错误以及如何调试 Server Sent Events?
+++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++
我在 console.log 中找到了 chrome 中的登录,当我将 console.log 代码放在代码中下面显示的位置时。
<script>
if(typeof(EventSource) !== "undefined") {
console.log("SSE is supported"); //placing console.log here, displays the message in chrome developer tool
var source = new EventSource("auto_update.php?r=<?php echo $get_value_this_url; ?>");
source.onmessage = function(event) {
console.log("message isn't received from server"); //placing console.log here doesn't display any log message in Chrome Developer Tool
var obj = JSON.parse(event.data);
$("#chats-ul").append('<li class="chats"><span id="nicknameChats">'+obj.user+'</span>: '+obj.chats+'</li>');
$('#chats-ul').scrollTop($(window).height());
};
} else {
document.getElementById("chats-ul").innerHTML = "Your browser doesn't support a part of HTML5, so please use modern browsers like Chrome, Firefox, etc.";
}
</script>
所以从上面的console.log,我们看到SSE脚本没有从后端接收消息,后端代码如上所示,你能指出后端代码有什么问题吗?
您想报告错误吗?
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
由于它只适用于一个提供商而不适用于另一个提供商,因此可能是服务器配置问题。
您可以尝试通过以下方式缩小问题范围:
- 在 javascript 脚本中使用
console.log(event)
检查您是否从服务器获取任何内容 - 检查浏览器开发人员工具区域中的网络选项卡(在Chrome中选择其他以查看服务器发送的事件)。
如果没有输出,请尝试缩小服务器上的问题范围。尽早解析 SSE 输出以查看 SSE 机制是否有效。一点一点地解决 SSE,直到它崩溃。如果提供商之间的特定线路存在差异,则可能是由于 PHP 版本。在 php 文件中比较 php 版本 运行 <?php phpinfo() ?
。
如果您发现差异,请联系您的供应商!