Codeigniter长轮询阻止其他ajax请求

时间:2017-03-21 20:20:05

标签: php ajax codeigniter long-polling

我希望使用长轮询在Codeigniter框架内实现伪实时聊天应用。我知道这不是最好的选择(我可以尝试使用HTML5 Websocket),但是我在cPanel共享帐户上,所以我没有任何安装任何权限

所以,让我们回到这个问题本身。 基本上,我使用类似于下面的.js文件:

    //get server time
    var time;
    $.ajax( {
         url: JS_BASE_URL + 'admin/users/get_time',
         success: function( dataResponse ) {
             time = dataResponse;
        },
        type: 'GET'
    } ); 
    //long polling AJAX 
    function getNewMsgs() {
        $.ajax( {
            url: JS_BASE_URL + 'admin/users/get_new_msgs',
            type: 'POST',
            // send the time
            data: { time: time, sender_id: sender_id },
            dataType: 'json',
            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            success: function( dataResponse ) {
                // update the time
                time = dataResponse.time;
                // show the new messages
                dataResponse.msgs.forEach( function( msg ) {
                    preparePost('in', (msg.date_sent), msg.sender_id, 'avatar3', msg.message);        
                } );
                // repeat
                setTimeout( getNewMsgs(), 1000 );
            },
            error: function (XMLHttpRequest, textStatus, errorThrown){
                setTimeout( getNewMsgs(), 1000 );    
            }                   
        } );
    }
    getNewMsgs(); // this one is on the document ready

用户控制器中的php get_new_msgs函数:

function get_new_msgs() {    
    echo json_encode( array(
        'msgs' => $this->aauth->start_polling($this->aauth->get_user()->id),
        // response again the server time to update the "js time variable"
        'time' => time() 
    ) );
    die();
}

模型函数start_polling:

function start_polling($receiver_id) {
    // get the time
    $time      = $this->CI->input->post( 'time' );
    $sender_id = $this->CI->input->post( 'sender_id' );

    // some crappy validation
    if( !is_numeric( $time ) ) {
        return array();
    }

    $time = date('Y-m-d G:i:s',$time);
    // -> 2010-10-01
    //$time = $time['year'] + '-' + $time['mon'] + '-' + $time['mday'];

    while( true ) {

        $where = 'date_sent >= "' . $time . '" AND ((receiver_id=' . $receiver_id . ' AND pm_deleted_receiver IS NULL AND sender_id=' . $sender_id . ' AND pm_deleted_sender IS NULL) OR (receiver_id=' . $sender_id . ' AND pm_deleted_receiver IS NULL AND sender_id=' . $receiver_id . ' AND pm_deleted_sender IS NULL))'; 
        $query = $this->aauth_db->where($where);
        $query = $this->aauth_db->order_by('id','ASC');
        $query = $this->aauth_db->get( $this->config_vars['pms']);
        //die($this->aauth_db->last_query());
        if( $query->num_rows() > 0 ) {
            $result = $query->result();
            if ($this->config_vars['pm_encryption']){
                $this->CI->load->library('encrypt');

                foreach ($result as $k => $r)
                {
                    $result[$k]->title   = $this->CI->encrypt->decode($r->title);
                    $result[$k]->message = $this->CI->encrypt->decode($r->message);
                }
            }
            echo json_encode($result);
            die();


 } else {
        sleep( 1 );
        continue;    
    }
}

}

现在,问题在于每当我通过聊天运行页面时,都会加载一个请求并等待来自服务器的响应。但是,没有其他请求将完成..似乎在长轮询后发送的其他请求正在等待第一个完成..即使我停止脚本,页面将加载非常慢..

对我失踪的事情有任何想法? 提前谢谢!

0 个答案:

没有答案