Как увидеть ошибки о событиях, отправленных сервером?

Я закодировал веб-сайт, используя 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 не получает сообщения от серверной части, а код серверной части показан выше. Можете ли вы показать, что не так с кодом серверной части?


person Yogie    schedule 18.09.2015    source источник
comment
Вы пробовали сообщения console.log на своей html-странице, чтобы увидеть, что получает браузер?   -  person chriskelly    schedule 19.09.2015
comment
@AdamBuchananSmith Я на 100% уверен, что вы не с трудом прочитали весь вопрос, и вы судили о вопросе, основываясь на его названии, и, что хуже всего, вы проголосовали за него, просто основываясь на своем предположении. Теперь этому вопросу будет уделяться меньше внимания только из-за вашей лени. Мое сердце может многое сказать о тебе, однако пока я прислушаюсь к своему разуму. Вопрос не в том, как получить ошибки PHP? а как получить ошибки про SSE, т.е. console.log. Я почитаю о console.log и попробую Поможете вы или создадите препятствие, я найду ответ и заставлю его работать.   -  person Yogie    schedule 19.09.2015
comment
@chriskelly Я сделал console.log и поместил его в строку, показанную в коде (только что обновил свой вопрос), и это не отображает никаких сообщений журнала в инструменте разработчика Chrome, поэтому я анализирую, что он не получает сообщения с сервера, не так ли? есть идеи, что может быть не так?   -  person Yogie    schedule 19.09.2015
comment
Может дело в базе данных? Вы уверены, что num_records больше 0? Действительно ли ob_end_flush() вызывается? Можете ли вы вернуть количество сообщений и console.log(), которые были первыми?   -  person chriskelly    schedule 19.09.2015
comment
@chriskelly num_records больше 0, я проверил с помощью оператора echo из цикла while, также я применил метод удара и пробы и обнаружил, что if($_SESSION["id"] < $id) не оценивается как true, и если я сделаю это истинным, поскольку if(true) SSE работает нормально , поэтому кажется, что что-то не так с SESSION, однако точно такой же код работает на виртуальном хостинге Godaddy с отключенным SSL, но не на виртуальном хостинге 101domain с включенным SSL. Итак, одним из отличий серверов является SSL, может ли это привести к проблемам с SESSION?   -  person Yogie    schedule 19.09.2015
comment
Откуда вы получаете $id? Это переменная $_REQUEST? Может быть, глобальные переменные php включены godaddy? Вы пытались сравнить вывод функции phpinfo() на вашем godaddy и 101domain, чтобы увидеть, настроены ли они по-разному? Если это работает на одном сайте, а не на другом, должна быть какая-то специфичная для сайта разница.   -  person chriskelly    schedule 20.09.2015
comment
@chriskelly На обоих серверах разные версии PHP. У Godaddy есть PHP 5.4.43, а у 101domain есть PHP 5.3.3, поэтому я сейчас выясняю различия, чтобы я мог включать/выключать разные вещи.   -  person Yogie    schedule 20.09.2015
comment
Приятно слышать, что вы сузили его. Удачи с последними шагами. Это также доказывает, что это не дублирующий вопрос!   -  person chriskelly    schedule 20.09.2015
comment
@Yogie Я никогда не голосовал против твоего вопроса :/   -  person Adam Buchanan Smith    schedule 21.09.2015
comment
@chriskelly Проблема заключалась в разнице в версиях PHP, и как только я обновил версию PHP, поговорив со службой поддержки, проблема была исправлена. Пожалуйста, не стесняйтесь опубликовать это как ответ, и я приму его как правильный ответ. Также проголосует за вас. Спасибо за помощь, console.log помог мне найти разные версии.   -  person Yogie    schedule 23.09.2015
comment
@chriskelly Я разговаривал со службой поддержки, и они снова открыли этот вопрос, теперь вы можете ответить на этот вопрос. Спасибо!   -  person Yogie    schedule 24.09.2015


Ответы (2)


Поскольку в результате он работает с одним провайдером, но не с другим, вероятно, это проблема конфигурации сервера.

Вот некоторые вещи, которые вы можете попробовать, чтобы сузить проблему:

  • В скрипте javascript используйте console.log(event), чтобы проверить, получаете ли вы что-нибудь с сервера.
  • Проверьте вкладку сети в области инструментов разработчика браузеров (в Chrome выберите другое, чтобы просмотреть события, отправленные сервером).

Если выходных данных нет, попробуйте сузить проблему на сервере. Заблаговременно разрешите вывод SSE, чтобы увидеть, работает ли механизм SSE. Постепенно разрешайте SSE все позже и позже, пока он не сломается. Если есть разница в конкретной строке между провайдерами, это может быть связано с версией PHP. Чтобы сравнить версии php, запустите <?php phpinfo() ? в файле php.

Если вы обнаружите разницу, свяжитесь со своим провайдером!

person chriskelly    schedule 24.09.2015

Вы хотите сообщить об ошибках?

<?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);
?>
person Adam Buchanan Smith    schedule 18.09.2015
comment
Это не то, что я искал, а чтобы увидеть ошибки javascript в html, когда он не работает нормально. Я не буду голосовать против, хотя. - person Yogie; 19.09.2015