2013-09-25 9 views
0

Я новичок в кометах и ​​делаю простое приложение. Мой HTML файл выглядитComet - ошибка PHP, показывающая

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>testing comet</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript" src="jquery-1.9.0.js"></script> 
    </head> 
    <body> 

<div id="content"> 
</div> 

<p> 
    <form action="" method="get" onsubmit="comet.doRequest($('#word').val());$('#word').val('');return false;"> 
    <input type="text" name="word" id="word" value="" /> 
    <input type="submit" name="submit" value="Send" /> 
    </form> 
</p> 

<script type="text/javascript"> 
// comet implementation 
var Comet = function (data_url) { 
    this.timestamp = 0; 
    this.url = data_url; 
    this.noerror = true; 
//alert(data_url); 
    this.connect = function() { 
    var self = this; 

    $.ajax({ 
     type : 'get', 
     url : this.url, 
     dataType : 'json', 
     data : {'timestamp' : self.timestamp}, 
     success : function(response) { 
     self.timestamp = response.timestamp; 
     self.handleResponse(response); 
     self.noerror = true;   
     }, 
     complete : function(response) { 
     // send a new ajax request when this request is finished 
     if (!self.noerror) { 
      alert("error"); 
      // if a connection problem occurs, try to reconnect each 5 seconds 
      setTimeout(function(){ comet.connect(); }, 5000);   
     }else { 
      // persistent connection 
      self.connect(); 
     } 

     self.noerror = false; 
     } 
    }); 
    } 

    this.disconnect = function() {} 

    this.handleResponse = function(response) { 
    $('#content').append('<div>' + response.msg + '</div>'); 
    } 

    this.doRequest = function(request) { 
     $.ajax({ 
     type : 'get', 
     url : this.url, 
     data : {'msg' : request} 
     }); 
    } 

} 

var comet = new Comet('./backend.php'); 
comet.connect(); 
</script> 

</body> 
</html> 

backend.php выглядит

<?php 
$dr=DIRECTORY_SEPARATOR; 
$filename = dirname(__FILE__).$dr.'data.txt'; 

// store new message in the file 
$msg = isset($_GET['msg']) ? $_GET['msg'] : ''; 
if ($msg != '') 
{ 
    file_put_contents($filename,$msg); 
    die(); 
} 

// infinite loop until the data file is not modified 
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$currentmodif = filemtime($filename); 
while ($currentmodif <= $lastmodif) // check if the data file has been modified 
{ 
    usleep(10000); // sleep 10ms to unload the CPU 
    clearstatcache(); 
    $currentmodif = filemtime($filename); 
} 

// return a json array 
$response = array(); 
$response['msg']  = file_get_contents($filename); 
$response['timestamp'] = $currentmodif; 
echo json_encode($response); 
flush(); 

data.txt содержит пустой файл.

Теперь мой вопрос

if (!self.noerror) { 
     alert("error"); 

Это будет выполнять и показывать предупреждение «ошибка» всегда. Но он отлично работает, если я прокомментирую эту часть предупреждения. Что-то не так ?

Когда я отслеживаю процесс с помощью firebug, по этим запросам, получаю такую ​​роковую ошибку.

enter image description here

Любой, пожалуйста, помогите мне Спасибо заранее

ответ

0

Тайм-аут вопрос будет вызван ваш время цикла неисправного, чтобы выйти, прежде чем PHP выходит, так как значение max_execution_time директивы было достигнуто. Вы можете расширить это, но действительно ли вы хотите, чтобы скрипты работали так долго? Я бы больше склонялся к тому, чтобы делать больше работы в JavaScript - заставлять его запрашивать обновление каждую секунду или около того (10 мс далеко, слишком часто).

Что касается alert("error"), будьте осторожны, когда вы устанавливаете значение noerror - вы действительно хотите установить его в false в конце функции complete()? Я думаю, что вы хотите изменить свой призыв $.ajax() к чему-то более, как это (сокращенном):

$.ajax({ 
    error : function() { 
     // the request failed 
     setTimeout(function() { comet.connect(); }, 5000); 
    }, 
    success : function(response) { 
     // the request succeeded 
     self.connect(); 
    } 
}); 

Если вы можете удалить переменную noerror целиком и использовать error() и success() обратные вызовы для размещения вашей логики для каждого сценария, как выше.

+0

спасибо за ваш комментарий .. Еще одно сомнение .. это комета типа - PHP настроен надежно на общем сервере? Скажите, есть ли еще несколько пользователей, запрашивающих одно и то же время? – ramesh

+0

Серверы могут обрабатывать множество запросов одновременно - я бы не подумал дважды об этом. –

0

Вы должны редактировать backend.php линии;

<?php 
    $dr=DIRECTORY_SEPARATOR; 
    ini_set('max_execution_time', 300); 
    $filename = dirname(__FILE__).$dr.'data.txt';