我希望使用长轮询在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;
}
}
}
现在,问题在于每当我通过聊天运行页面时,都会加载一个请求并等待来自服务器的响应。但是,没有其他请求将完成..似乎在长轮询后发送的其他请求正在等待第一个完成..即使我停止脚本,页面将加载非常慢..
对我失踪的事情有任何想法? 提前谢谢!