如何查看有关服务器发送事件的错误?

时间:2015-09-18 23:33:33

标签: javascript php server-sent-events

我使用HTML5 Server Sent Events编写了一个网站,它在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。

我尝试在PHP和HTML中使用字符集UTF-8,但是没有帮助,我尝试在服务器端PHP脚本中添加ob_flush并且它也有帮助。

connection.php没什么问题,因为其他页面上的同一文件运行正常。 在聊天功能上,聊天消息将被插入到数据库中,但它不会显示在页面上,除非我们刷新页面。

如何检查错误以及如何调试Server Sent Events?

+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++

当我在代码中显示下面显示的时间点放置console.log代码时,我执行了console.log并且没有找到chrome中的日志。

<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脚本没有从后端接收消息,后面的代码如上所示,你能说明后端代码有什么问题吗?

2 个答案:

答案 0 :(得分:1)

由于结果它与一个提供程序一起使用而不是另一个提供程序,因此可能是服务器配置问题。

以下是您可以尝试缩小问题范围的一些事项:

  • 在javascript脚本中使用console.log(event)检查您是否从服务器获取任何内容
  • 检查浏览器的开发者工具区域中的网络标签(在Chrome中选择其他以查看服务器发送的事件)。

如果没有输出,请尝试缩小服务器上的问题范围。 Resolev SSE早期输出,看看SSE机制是否有效。逐位解析SSE以后再解决它直到它中断。如果提供者之间的特定行存在差异,则可能是由于PHP版本。要比较php版本在php文件中运行<?php phpinfo() ?

如果您发现差异,请与您的提供商联系!

答案 1 :(得分:0)

您想报告错误吗?

<?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);
?>