长轮询锁定其他AJAX呼叫

长轮询锁定其他AJAX呼叫

问题描述:

我正在寻找做长轮询来“推”一些数据下来到客户端,我也做了与长轮询并行服务器的其他无关的AJAX调用。看起来,我的其他AJAX调用不会完成,直到长时间轮询收到响应(无论是响应还是超时)。当我浏览Javascript时,看起来第二个AJAX请求在适当的时候被发送,但是在长的轮询请求得到响应之前没有收到响应。任何想法是怎么回事?长轮询锁定其他AJAX呼叫

这里是长轮询部的代码:

服务器端:

function getPlaylistTracksIfChanged($playlist_id, $numClientTracks) { 
    $reportChange = false; 
    for($i = 0; $i < 10; $i++) { 
    $numServerTracks = $this->PlaylistTrack->find('count', array(
    'conditions' => array('playlist_id' => $playlist_id) 
    ) 
    ); 

    if($numClientTracks != $numServerTracks) { 
    $reportChange = true; 
    break; 

    } 

    sleep(3); 

    } 

    if($reportChange) { 
    $playlist_tracks = $this->PlaylistTrack->find('all', array(
    'conditions' => array('playlist_id' => $playlist_id), 
    'order' => array('PlaylistTrack.position') 
    ) 
    ); 

    $this->set('playlist_tracks', $playlist_tracks); 
    $this->layout = false; 
    $this->render('show_playlist_tracks_list'); 

    } else { 
    $this->autoRender = false; 
    return 'false'; 
    } 

} 

客户端:

function checkForChangesOnServer() { 
$.post('/getResultsIfChanged/' + playlist_id + '/' + $('#sortable_tracks').children().size(), function(results) { 

    if(results == 'false') { 
    //alert('no change'); 
    } else { 
    //alert('change'); 
    } 

    checkForPlaylistChangesOnServer(); 

}); 
} 

而另一AJAX调用的示例:

服务器端:

function getLibraryTracksStartingWithLetter($user_id, $letter) { 
    $results = $this->Track->find(
    'all', 
    array(
    'conditions' => array(
    'user_id' => $user_id, 
    'OR' => array(
     'Track.artist LIKE' => $letter . '%', 
     'Track.name LIKE' => $letter . '%' 
    ) 
    ), 
    'order' => array('case when Track.artist = "" then 1 else 0 end', 'Track.artist', 'Track.name') 
    ) 
); 

    $this->set('results', $results); 
    $this->layout = false; 
    $this->render('show_library_results_list'); 
} 

客户端:

function loadLibraryResultsForLetter(letter) { 
highlightLetterFilter(letter); 

$.post('/getLibraryTracksStartingWithLetter/' + user_id + '/' + letter, function(results) { 
    updateLibraryResults(results); 
}); 
} 

好像你所经历的会议文件锁定。

执行session_write_close()(或cakephp中的相应函数)在ajax端点开始时关闭会话。

+0

用户session_write_close();不知道它很酷的东西 – RageZ 2010-12-16 03:33:01

+1

@RageZ:每一个PHP开发人员应该抓住这个问题:-) – zerkms 2010-12-16 03:34:07

+0

有意义现在我想它 – RageZ 2010-12-16 03:34:43

发生这种情况是因为会话文件锁定。在CakePHP中,您可以选择其他用于会话管理的选项。您可以将会话保存在数据库中,缓存等中。因此,您不必等待文件锁定问题。

内置的配置是:

PHP - 保存会话在php.ini文件的标准设置。

蛋糕 - 将会话保存为app/tmp/sessions中的文件。如果主机不允许您在自己的 主目录之外写入,则这是一个很好的 选项。

数据库 - 使用内置的数据库会话。

缓存 - 使用内置的缓存会话。

http://book.cakephp.org/2.0/en/development/sessions.html#built-in-session-handlers-configuration

当然你也可以让session_write_close(),但你应该确保需要会话没有改变两页的负荷之间。

类似的问题:Simultaneous Requests to PHP Script

它为symfony的1.4。而不是$this->getUser()->shutdown();