Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是一种合法的长轮询方法吗?_Php_Mysql_Ajax_Long Polling - Fatal编程技术网

Php 这是一种合法的长轮询方法吗?

Php 这是一种合法的长轮询方法吗?,php,mysql,ajax,long-polling,Php,Mysql,Ajax,Long Polling,这个PhP脚本是一种合法的长轮询方法,还是对服务器来说太重了 $FoundNewContent = false; $tokens = array(); while(!$FoundNewContent) { usleep(300000); clearstatcache(); $SQL1 = "SELECT * FROM tokens WHERE ID > ".$_GET['tokenID']; $result1 = mysql_query($SQL1);

这个PhP脚本是一种合法的长轮询方法,还是对服务器来说太重了

$FoundNewContent = false;

$tokens = array();

while(!$FoundNewContent) {
    usleep(300000);
    clearstatcache();
    $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
    $result1 = mysql_query($SQL1);
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
        array_push($tokens, $row1);
        $FoundNewContent = true;
    }
}

// Parse XML array    

flush()

我通过Ajax调用此脚本。

取决于您的服务器设置-只要不使用会话,它就可以正常工作,但如果一次连接太多,则可能会导致服务器暂停

此外,我还将添加一个时间限制,在该限制中,它不返回任何内容并重新启动轮询。否则,如果不添加任何数据且服务器超时设置为无限,则脚本可能永远运行。我通常加上30秒的限制

比如:

$FoundNewContent = false;
$tokens = array();
$time = time();
while(!$FoundNewContent) {
  usleep(300000);
  clearstatcache();
  $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
  $result1 = mysql_query($SQL1);
  while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
    array_push($tokens, $row1);
    $FoundNewContent = true;
  }
  if($time<time()-30) break;
}
flush()
$FoundNewContent=false;
$tokens=array();
$time=time();
while(!$FoundNewContent){
美国LEEP(300000);
clearstatcache();
$SQL1=“从ID>的令牌中选择*”$\u GET['tokenID'];
$result1=mysql\u查询($SQL1);
而($row1=mysql\u fetch\u数组($result1,mysql\u ASSOC)){
数组推送($tokens,$row1);
$FoundNewContent=true;
}

如果($time)如果
$FoundNewContent
true
,您没有做任何事情。之后您正在刷新。输出是什么?只是空白?实际上,在while循环和刷新之间,我解析一个xml数组,然后在jqueryy中处理。您没有回显任何内容,对吗?我的意思是……我不确定……是的,我是echo“”然后通过foreachYes将所有内容作为标记是的,我应该提到……你是说“session_start()”中的会话吗?那么是的,我正在使用一个。是的-如果使用session_start(),根据我的经验,你需要在循环之前的某个地方运行session_write_close(),否则脚本将阻塞。session_write_close()将阻止您更改会话中的内容,因此如果必须,请在更改之前使用会话_start(),然后再使用会话_write_close()。因此,如果一次有10到15个客户端轮询内容,即每秒30到45个mysql SELECT请求,我就不必担心了?10到15个客户端不应该是问题;o)