长轮询锁定其他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();