我使用HTML5服務器發送事件編寫了一個網站,它的工作方式像Godaddy共享主機上的魅力一樣,但是具有完全相同的代碼的同一網站在101domain共享主機上不工作。 休息一切工作正常,除了聊天功能使用服務器發送事件。如何查看有關服務器發送事件的錯誤?
如何查找腳本中的錯誤。
這是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上工作。
我試着把字符集UTF-8放在PHP和HTML中,但沒有幫助,我試圖在服務器端PHP腳本中添加ob_flush,它也沒有幫助。
connection.php沒有問題,因爲其他頁面上的相同文件可以正常工作。 在聊天功能上,聊天消息正在插入到數據庫中,但它不會顯示在頁面上,除非我們刷新頁面。
如何檢查錯誤以及如何調試服務器發送的事件?
++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++
我做了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腳本不從後端接收消息和後端代碼如上圖所示,可以顯示什麼是錯的後端代碼?
你嘗試過的console.log在HTML頁面中的信息,看看瀏覽器獲得了什麼? – chriskelly
@AdamBuchananSmith @我是100%確定的,你沒有閱讀整個問題的困難,你根據題目來判斷問題,最糟糕的是,你根據你的假設投下了它。 現在這個問題會因爲你的懶惰而受到較少的關注。我的心裏有很多關於你的話,但是現在我會聽到我的想法。 問題不在於「如何獲取PHP錯誤?」但「如何獲取有關SSE,即執行console.log的錯誤。我會@chriskelly讀到的console.log,並會嘗試 無論你幫助或創建障礙,我一定會找出答案,並會令它的工作。 – Yogie
我做了console.log並將其放在代碼中顯示的一行(只是更新了我的問題),並且這不會在Chrome Developer Tool中顯示任何日誌消息,因此我分析它不會從服務器獲取消息,您有任何想法,什麼可能是錯誤的? – Yogie