接近PHP和AJAX的实时通知

时间:2016-07-09 08:06:39

标签: php jquery ajax

我知道有人问过,但我无法弄明白。我正在构建一个应用程序,用户将收到通知(不是实时,但是关闭 - 所以我不想使用套接字)。

这个想法如下:如果用户注册,他的状态是未经验证的。一旦他完成了个人资料并且管理员已经批准,它将被验证,然后我想显示一个小通知说:"嘿,你现在已经被验证了!"。

我尝试了什么

关注this example

到目前为止,我已经尝试过轮询并陷入PHP方面。在我的逻辑中,我需要循环表并检查列更改。一旦列从0更改为1,请停止循环,然后将数据附加到Ajax调用中。这是对的吗?

  1. 鉴于它不需要是实时的,这是最好的方法吗?
  2. 如何改进Ajax功能,只在列发生变化时附加状态?
  3. 在PHP中,我是否需要包含时间戳来检查数据,我是否需要sleep()
  4. JS

    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

    <?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));
    }
    ?>
    

1 个答案:

答案 0 :(得分:0)

长轮询很好,但对于这种情况效率不高,因为服务器只知道何时发送通知。在长轮询中,您将使客户端和服务器都忙,并且会在许多用户使用长轮询时将负载放在服务器端。

在给定的示例中,服务器将在客户端完成所有注册过程后立即发送通知,解决方案可能是使用服务器端事件。

服务器发送的事件:
在此类连接中,客户端建立与服务器的持久连接。只有服务器才能向客户端发送数据。该协议与HTTP兼容,并且在大多数服务器端平台上易于实现。这是一个很好的协议,而不是长轮询。

支持的浏览器: http://caniuse.com/#feat=eventsource