【问题标题】:Persistent Connection to server with PHP infinite loop使用 PHP 无限循环与服务器的持久连接
【发布时间】:2012-06-08 11:13:52
【问题描述】:

我想保持我的网站更新,在数据库中添加了一项新信息。我不能使用Node.jsComet Programming,而Javascript's setInterval 似乎是个坏主意,因为请求太多。

现在我正在使用这样的东西:

Javascript:

var url = "path_to/file.php";
var req = xmlhttp();
req.open("GET", url, true);
req.send(null);
poll = setInterval(getResponse, 100);
function getResponse()
{
  var data = req.responseText;
  var res = document.getElementById("response");
  res.innerHTML = data;
}

PHP:

<?php
  set_time_limit(0);
  ob_start(); 

   while(true)
   {
    #CODE
    flush(); 
    ob_flush(); 
    sleep(0.3); 
   }

  flush(); 
  ob_flush(); 
?>

这是个好主意吗?我可以毫无问题地使用它吗?也许有人知道保持持久连接的更好方法? (在我的网站上将有大约 500 名在线用户)

【问题讨论】:

  • 你想做什么,想要的结果是什么?为什么会有这个无限循环?这个flush(); ob_flush(); 在你的while(true){..} 之后永远不会被执行......
  • @shadyyx 此示例将用于聊天系统,但一旦将新信息添加到数据库中,我还必须在网站上显示新信息。 (我认为每秒发送 Ajax 请求会减慢整个页面的速度)。 [谢谢,我将删除这些行。 ]
  • 我从未见过这样的实现,但 AJAX 请求。如果您认为每一秒都非常耗费时间和服务器资源,您仍然可以每 3 秒左右请求一次更改...

标签: php javascript infinite-loop persistent-connection


【解决方案1】:

通过WebSockets 推送是一种替代方法,但仅适用于最新版本的浏览器。

您的脚本的缺点是每 100 毫秒询问一次(这很短),即使最新的 ajax 响应还没有到达。仅当上一个 ajax 已到达并且自上一个 ajax 已达到最短时间(超时)时,我才会更改脚本以请求服务器进行更改。

例如(未经测试):

function getResponse() {
    var data = req.responseText;
    var res = document.getElementById("response");
    res.innerHTML = data;
    setTimeout(getResponse, 500);
}
var url = "path_to/file.php";
var req = xmlhttp();
req.open("GET", url, true);
req.send(null);
getResponse();

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 2012-07-30
    • 2021-03-15
    • 2012-01-22
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多