Php 这是一种合法的长轮询方法吗?
这个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);
$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)