我在一个页面内有一个iframe,该页面正在不断地轮询服务器以获取正在由“主要” XHR主动更新的会话变量。
所以基本上:
主XHR运行并完成其任务,并在运行时更新会话变量。通常需要一段时间,例如超过10秒。
当主要XHR运行时,我使用并行XHR请求在服务器上轮询相同的会话变量。每当我收到来自轮询XHR的响应时,就应该更新前端视图。
问题在于,轮询XHR直到主XHR完成后才返回任何内容,这时它们已经毫无用处了。在处理会话时,这真的是预期的行为吗?像每个客户端连接一个会话之类的限制?
编辑:
这是一些代码片段。代码很大,因此我尝试将其精简为基本要素。当我只是从源代码中取出重要部分时,可能在此处键入某些语法错误。
生成iframe
(function($) { $(document).on('click','#proceed_form',function(){ $('#upload_frame').show(); function set () { $('#upload_frame').attr('src','/productUpload/generateIframe'); } setTimeout(set); }); });
iframe
<script type='text/javascript' src="/assets/js/src/vendor/jquery-1.9.1.js" ></script> <script> (function($) { $(document).ready(function() { setInterval(function() { $.get("/productController/getProgress", function(data) { $('#progress_container').fadeIn(100); //fade in progress bar $('#progress_bar').width(data +"%"); //set width of progress bar based on the $status value (set at the top of this page) $('#progress_completed').html(parseInt(data) +"%"); //display the % completed within the progress bar } )},500); }); })(jQuery); </script> <div id="progress_container"> <div id="progress_bar"> <div id="progress_completed"></div> </div> </div>
PHP应用
class productUpload extends CI_Controller{ /** * Respond to XHR poll request * */ public function getUploadedBytesToCloud() { session_start(); $uploadedBytes = $_SESSION['bytes_uploaded']; echo json_encode(['uploadedBytes' => $uploadedBytes]); } /** * Main controller action * Uploads the images of a product to the cloud * */ public function moveProductImagesToCloud($productId) { /** * Some logic to get the product image directory * */ $productPath = '/assets/product/image_dir'; $directoryMap = directory_map($productPath); foreach($directoryMap as $key => $file){ /** * Upload file to AWS S3 bucket */ $this->awsUploader->uploadFile(...); $fileSize = $_SESSION['bytes_uploaded']; $fileSize += filesize(getcwd()."/".$productPath."/".$file); $_SESSION['bytes_uploaded'] = fileSize; } } }
是的,默认会话管理器(使用文件)在执行session_start时锁定会话文件,在执行session_write_close(或脚本结束)时释放会话文件。同时,其他尝试访问会话的脚本等待发布。此处或在手动session-write- close上有详细的文章