0

我是彗星的新手,正在做一个简单的应用程序。我的 html 文件看起来像

<!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 跟踪进程时,在这些请求上,得到一个像这样的致命错误。

在此处输入图像描述

任何人请帮助我提前谢谢

4

2 回答 2

0

超时问题将是由于您的 while 循环在 PHP 退出之前未能退出,因为max_execution_time已达到指令的值。您可以扩展它,但您真的希望脚本运行那么久吗?我更倾向于在 JavaScript 中做更多的工作——让它每秒左右请求一次更新(10 毫秒太频繁了)。

关于alert("error"),要小心你设置的值noerror- 你真的想在complete()函数结束时将它设置为 false 吗?我想你想把你的电话改成$.ajax()更像这样的东西(缩写):

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

如果可以,请noerror完全删除变量并使用error()success()回调来容纳每个场景的逻辑,如上所示。

于 2013-09-25T04:06:35.573 回答
0

您必须编辑 backend.php 行;

<?php
   $dr=DIRECTORY_SEPARATOR;
   ini_set('max_execution_time', 300);
   $filename  = dirname(__FILE__).$dr.'data.txt';
于 2013-09-25T03:51:10.563 回答