0

我想在我公司的 erp 中创建类似于 Facebook 的通知系统。为了保持良好的性能,我使用长轮询 - 循环 ajax 查询 php 脚本的秒数。一切正常,直到我尝试转到 ERP 中的另一个页面。当我单击页面上的任何链接时,一切都会冻结,直到后台 php 脚本完成,即使我手动终止了 ajax 连接。JS 脚本包含在每个页面中,并在页面加载时自行启动。

function notificationsObject(){
  var nl = new Object();

nl.startAjax = function(data){
    if(nl.ajaxObject != null) try{ nl.ajaxObject.abort() } catch(e){} finally{nl.ajaxObject = null}
    nl.ajaxObject = $.ajax({
      url: nl.ajaxUrl, //declared before function declaration
      type: 'POST',
      data: {data: data}
    }).done(function(responseText){nl.ajaxSuccess(responseText)
    }).fail(function(responseText){nl.ajaxFail(responseText)});

  }

  nl.ajaxSuccess = function(response){
      console.debug(response);
      nl.startAjax();
  }

  nl.ajaxFail = function(response){
    //@todo some code here
  }


  nl.killConnection = function(){
    if(nl.ajaxObject != null) try{ nl.ajaxObject.abort() } catch(e){} finally{nl.ajaxObject = null}
    console.debug('killing');
  }

(more code here)
return nl;
}

初始化代码看起来像这样

$(document).ready(function(){

  var notifications = notificationsObject();
  notifications.startAjax({name: 'startup'});

  setTimeout(function(){window.onbeforeunload = function(){notifications.killConnection()};}, 1000);

});

还有一些 PHP 代码:

public function executeUsersNotificationListener(){
    ignore_user_abort(false);
    ob_end_flush();
    $this->getResponse()->setHttpHeader("Cache-Control", "no-cache");
    $this->getResponse()->setHttpHeader("Pragma", "no-cache");
    $this->getResponse()->setHttpHeader("Expires", 0);

    $timeLimit = 30;
    set_time_limit($timeLimit+1);

    echo 'test';

    $i = 0;
    while($i++ < $timeLimit){

      echo "       ";

      sleep(1);
    }

    return sfView::NONE;
  }

正如你在上面看到的,我做了一些研究和使用ignore_user_abort等等,但它不起作用。

4

0 回答 0