这是一次真正的长期民意调查吗?
经过大量试验,我成功地能够与数据库保持连续的服务器连接。 现在代码keet cheking并显示消息,如果数据库中有新的。
Plz检查并判断此代码中是否使用了真正的长轮询技术? 如果不是,那么PLZ建议,我错了(偏离长轮询)以及如何做一个真正的长轮询。
Currenlty,我收到了这些错误。但它仍然保持与数据库的连续连接。
- 每次只抽取一条消息而不是全部消息。 (我使用.each循环,但它停止长轮询)
-
每10/15秒后,出现令牌错误( Parse erroe(语法错误=意外令牌) )。
var last_msg_id = 2; function load_msgs() { $.ajax({ type:"Post", url:"getdata.php", data:{ last_msg_id:last_msg_id }, dataType:"json", async:true, cache:false, success:function(data) { var json = data; $("#commidwin").append(json['msg']); last_msg_id = json["last_msg_id_db"]; setTimeout("load_msgs()", 1000); }, error:function(XMLhttprequest, textstatus, errorthrown) { alert("error:" + textstatus + "(" + errorthrown + ")"); setTimeout("load_msgs()", 15000); } }); }
Php文件在这里
$last_msg_id=$_POST['last_msg_id']; $last_msg_id_db=1; while($last_msg_id>$last_msg_id_db){ usleep(10000); clearstatcache(); $sql=mysqli_query($db3->connection,"SELECT * FROM chat_com where id>'$last_msg_id' ORDER by id ASC"); $sql_m=mysqli_query($db3->connection,"SELECT max(id) as maxid FROM chat_com"); $row_m=mysqli_fetch_array($sql_m); $last_msg_id_db=$row_m['maxid']; while($row=mysqli_fetch_array($sql)){ $textt=$row['mesg']; $last_msg_id_db=$last_msg_id_db; $response=array(); $response['msg']=$textt; $response['last_msg_id_db']=$last_msg_id_db; } } echo json_encode($response);
轮询比简单更难:只是因为通常输出到浏览器的所有内容都将在完成后进行解释。 你的例子很清楚:
success:function(data) { var json = data; $("#commidwin").append(json['msg']); last_msg_id = json["last_msg_id_db"]; setTimeout("load_msgs()", 1000); },
jQuery将等到响应完成后构建data
变量,然后调用成功回调。
创建长轮询的一种方法是拥有一个任务和一个跟随者:
-
任务是“无限”循环,它只显示捕获和触发事件,只显示“框”。
-
跟随者是每X秒做一次ajax调用,它查看任务填充的“框”内部,并立即在页面内部进行操作。
这是一个长轮询的例子,没有追随者,只是一个停止民意调查的事件(释放),但你会明白:
$time) { $result = htmlentities(file_get_contents('poll.txt')); $poll = false; } // Of course, else your polling will kill your resources! $number_of_tries++; sleep(1); } // Outputs result echo "Number of tries : {$number_of_tries}
{$result}"; die(); } // Here we catch the release form if (isset($_GET['release'])) { $data = ''; if (isset($_GET['data'])) { $data = $_GET['data']; } file_put_contents('poll.txt', $data); die(); } ?>
Give me some text here :
Result after releasing polling :
示范: 这里 。
- 使用Knockout.js控制Flash插件,冲突jQuery.tmpl和Knockout-Sortable
- 使用jquery插件时,TypeError $(…)不是函数
- jQuery一次显示一个元素?
- 如果提交按钮是图像,则使用jQuery / AJAX提交的表单数据不会更新内容
- jquery – 如何基于另一个单击按钮设置一个单选按钮
- 使用jQuery选择具有“visibility:visible”或“visibility:hidden”样式的项目NOT“display:none”
- $ http和$ scope变量未在模板中显示
- select2-jquery:如何动态设置maximumselectionsize
- 带有BASIC身份validation的jQuery AJAX跨域