我知道有人问过,但我无法弄明白。我正在构建一个应用程序,用户将收到通知(不是实时,但是关闭 - 所以我不想使用套接字)。
这个想法如下:如果用户注册,他的状态是未经验证的。一旦他完成了个人资料并且管理员已经批准,它将被验证,然后我想显示一个小通知说:"嘿,你现在已经被验证了!"。
关注this example。
到目前为止,我已经尝试过轮询并陷入PHP方面。在我的逻辑中,我需要循环表并检查列更改。一旦列从0更改为1,请停止循环,然后将数据附加到Ajax调用中。这是对的吗?
sleep()
?function addNotification(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
console.log(type + msg);
}
var notiCount = 0;
function vaitForNotification(){
/* This requests the url "notifications .php" When it complete (or errors)*/
$.ajax({
type: "GET",
url: "PHP/notifications.php",
cache: false,
timeout:50000, /* Timeout in ms */
success: function(data){
if(data.verification_status[0].verification_status == "1"){
addNotification(data.verification_status[0].verification_status);
console.log("verified");
}else if(data.verification_status[0].verification_status == "0"){
addNotification(data.verification_status[0].verification_status);
console.log("not verified");
}
setTimeout(vaitForNotification, /* Request next message */
10000); /* ..after 10 seconds */
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addNotification("error", textStatus + " (" + errorThrown + ")");
setTimeout(vaitForNotification, /* Try again after.. */
15000); /* milliseconds (15seconds) */
}
});
};
vaitForNotification(); /* Start the inital request */
<?php
header('Content-type: application/json');
require_once '../../PHP/class.user.php';
$user_home = new USER();
if (empty($_SESSION['userSession'])) {
die();
}else{
$user_id= $_SESSION['userSession'];
$verification = $user_home->runQuery(
"SELECT verification_status FROM verification WHERE user_id =:user_id");
$verification->execute(array(":user_id"=>$user_id));
$verification_status = $verification->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(array("verification_status" => $verification_status));
//sleep(rand(2,10));
}
?>
答案 0 :(得分:0)
长轮询很好,但对于这种情况效率不高,因为服务器只知道何时发送通知。在长轮询中,您将使客户端和服务器都忙,并且会在许多用户使用长轮询时将负载放在服务器端。
在给定的示例中,服务器将在客户端完成所有注册过程后立即发送通知,解决方案可能是使用服务器端事件。
服务器发送的事件:
在此类连接中,客户端建立与服务器的持久连接。只有服务器才能向客户端发送数据。该协议与HTTP兼容,并且在大多数服务器端平台上易于实现。这是一个很好的协议,而不是长轮询。