我在一个页面中有一个iframe,它不断地在服务器上轮询一个会话变量,该变量正在被" main" 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);
});
});
I帧
<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;
}
}
}
答案 0 :(得分:3)
是的,默认会话管理器(使用文件)在执行session_start时锁定会话文件,并在执行session_write_close(或脚本结束)时释放它。同时其他脚本试图访问会话,等待发布。详细文章here或手册session-write-close