Я закодировал веб-сайт, используя HTML5 Server Sent Events, и он отлично работает на виртуальном хостинге Godaddy, однако тот же сайт с точно таким же кодом не работает на виртуальном хостинге 101domain. Остальное все работает нормально, за исключением функций чата с использованием событий, отправленных сервером.
Как найти ошибки в скрипте.
Вот HTML-страница с кодом javascript SSE.
<?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, но это не помогло, я попытался добавить ob_flush в PHP-скрипт на стороне сервера, и это тоже не помогло.
Нет ничего плохого в 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 не получает сообщения от серверной части, а код серверной части показан выше. Можете ли вы показать, что не так с кодом серверной части?
if($_SESSION["id"] < $id)
не оценивается как true, и если я сделаю это истинным, посколькуif(true)
SSE работает нормально , поэтому кажется, что что-то не так с SESSION, однако точно такой же код работает на виртуальном хостинге Godaddy с отключенным SSL, но не на виртуальном хостинге 101domain с включенным SSL. Итак, одним из отличий серверов является SSL, может ли это привести к проблемам с SESSION? - person Yogie   schedule 19.09.2015