长轮询锁定其他AJAX调用

我希望进行长时间轮询以将一些数据“推送”到客户端,并且我还与长轮询并行地向服务器进行其他无关的AJAX调用。 在长轮询收到响应(来自响应或超时)之前,我的其他AJAX调用似乎无法完成。 当我单步执行Javascript时,似乎第二个AJAX请求是在适当的时间发送的,但是在长轮询请求得到响应之前没有收到响应。 知道发生了什么事吗?

以下是长轮询部分的代码:

服务器端:

function getPlaylistTracksIfChanged($playlist_id, $numClientTracks) { $reportChange = false; for($i = 0; $i 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端点开头的会话。

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

内置配置为:

php – 使用php.ini文件中的标准设置保存会话。

cake – 将会话保存为app / tmp / sessions中的文件。 在不允许您在自己的主目录之外写入的主机上,这是一个不错的选择。

database – 使用内置数据库会话。

cache – 使用内置缓存会话。

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

当然你可以创建session_write_close() ,但是你应该确保两个页面加载之间的会话不需要进行任何更改。

类似的问题: PHP脚本的同时请求

它适用于symfony 1.4 。 user session_write_close(); 而不是$this->getUser()->shutdown();