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

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

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