jquery / ajax long-polling php mysql codeigniter

时间:2012-10-18 00:06:17

标签: php mysql ajax codeigniter long-polling

向那些投票的人提出这不是真正的问题,而这些问题绝对是偶然的。

我已经用Google搜索和搜索了一个月了,我找不到一个准确的例子 实际上使用php和mysql进行ajax长轮询。最好想找到一个用mysql和codeigniter进行ajax长轮询的例子。

任何人都会遇到这个问题而且有一个很好的例子请告诉我。

任何读过这篇文章的人都认为他们知道我正在寻找的ajax长期投票请给我发电子邮件或告诉我这里。 我几乎完成了使用Codeigniter的聊天应用程序,但我遇到了jquery / ajax长轮询部分是客户端的问题。 我没有发布这个聊天应用程序,因为上次我发布了另一个聊天应用程序我在这里有另一个开发人员抱怨我发布的代码太多了。我准备将此代码发送给任何能够实际提供有效的ajax长轮询代码的人。

非常感谢。

1 个答案:

答案 0 :(得分:5)

我想你将聊天消息存储在db中?所以一种方法看起来像这样:

最重要的是你需要在第一时间向用户提供服务器时间,这是获取新聊天消息的关键,所以首先,我们这样做:

var time;
$.ajax( {
     url: 'http://yoursite.com/chat/get_time',
     success: function( dataReponse ) {
         time = dataResponse;
    },
    type: 'GET'
} );

基于url "http://yoursite.com/chat/get_time",你需要一个名为"chat"的控制器,其名称为"get_time",该函数需要以毫秒为单位响应服务器时间,所以我们做这样:

function get_time() {
    echo time();
}

现在我们开始向服务器轮询新的聊天消息,我们这样做:

function getNewMsgs() {
    $.ajax( {
        url: 'http://yoursite.com/chat/get_new_msgs',
        type: 'POST',
        // send the time
        data: { time: time },
        success: function( dataResponse ) {
            try {
                dataResponse = JSON.parse( dataResponse );
                // update the time
                time = dataResponse.time;
                // show the new messages
                dataResponse.msgs.forEach( function( msg ) {
                    console.log( msg );
                } );
                        // repeat
                        setTimeout( function() {
                             getNewMsgs();
                        }, 1000 );
            } catch( e ) {
                // may fail is the connection is lost/timeout for example, so dataResponse
                // is not a valid json string, in this situation you can start this process again
            }
        }
    } );
}

comebacj到"chat"控制器,我们需要对"get_new_msgs"函数进行编码:

function get_new_msgs() {

    $this->load->model( 'chat_msg' );
    echo json_encode( array(
        'msgs' => $this->chat_msg->start_polling(),
        // response again the server time to update the "js time variable"
        'time' => time() 
    ) );
}

"chat_msg"模型中,我们对"start_polling"函数进行编码:

function start_polling() {
    // get the time
    $time = $this->input->post( 'time' );
    // some crappy validation
    if( !is_numeric( $time ) ) {
        return array();
    }

    $time = getdate( $time );
    // -> 2010-10-01
    $time = $time['year'] '-' + $time['mon'] + '-' + $time['mday'];

    while( true ) {

        $this->db->select( 'msg' );
        $this->db->from( 'chat_msg' );
        $this->db->where( 'time >=', $time );
        $this->db->order_by( 'posted_time', 'desc' );
        $query = $this->db->get();

        if( $query->num_rows() > 0 ) {
            $msgs = array();
            foreach( $query->result() as $row ) {
                $msgs[] = $row['msg'];
            }
            return $msgs;
        }

        sleep( 1 );
    }
}

得到警告,我在脑海中编写了这段代码,此时我没有配置Web服务器来测试此代码。