2015-09-18 65 views
3

我使用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腳本不從後端接收消息和後端代碼如上圖所示,可以顯示什麼是錯的後端代碼?

+0

你嘗試過的console.log在HTML頁面中的信息,看看瀏覽器獲得了什麼? – chriskelly

+0

@AdamBuchananSmith @我是100%確定的,你沒有閱讀整個問題的困難,你根據題目來判斷問題,最糟糕的是,你根據你的假設投下了它。 現在這個問題會因爲你的懶惰而受到較少的關注。我的心裏有很多關於你的話,但是現在我會聽到我的想法。 問題不在於「如何獲取PHP錯誤?」但「如何獲取有關SSE,即執行console.log的錯誤。我會@chriskelly讀到的console.log,並會嘗試 無論你幫助或創建障礙,我一定會找出答案,並會令它的工作。 – Yogie

+0

我做了console.log並將其放在代碼中顯示的一行(只是更新了我的問題),並且這不會在Chrome Developer Tool中顯示任何日誌消息,因此我分析它不會從服務器獲取消息,您有任何想法,什麼可能是錯誤的? – Yogie

回答

1

由於結果它與一個提供程序但不是另一個提供程序,它可能是一個服務器配置問題。

這裏有一些事情你可以嘗試縮小問題的範圍:

  • 在JavaScript腳本中使用console.log(event)檢查,如果你是從服務器
  • 得到任何東西檢查開發工具的網絡標籤瀏覽器區域(在Chrome中選擇其他查看服務器發送的事件)。

如果沒有輸出,則嘗試縮小服務器上的問題範圍。儘快解決SSE輸出以查看SSE機制是否有效。一點一點解決SSE稍後和稍後,直到它休息。如果提供者之間的特定線路有差異,則可能是由於PHP版本。比較php版本在php文件中運行<?php phpinfo() ?

如果您發現有區別,請聯繫您的供應商!

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

這不是我在找的東西,而是在html中看到javascript的錯誤,當它不能正常工作時。雖然我不會投票。 – Yogie