2014-11-24 136 views
1

我在一个不断轮询服务器的页面中有一个iframe,它正在被一个“主”XHR主动更新的会话变量。为什么我的XHR呼叫等待对方返回响应

所以基本上:

  1. 主要XHR运行并做它的事情,更新会话变量,因为它运行。通常需要一段时间,比如10秒以上。

  2. 当主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; 
      } 
     } 

} 
+1

请提供您用于制作和发送XHR的实际代码 - 无法从您的描述中了解发生了什么。 – Sacho 2014-11-24 09:56:53

+0

如果您尝试通过两个异步调用更新和获取相同变量,则听起来像有某种竞争条件正在发生。 – Vidur 2014-11-24 10:07:17

+0

@Sacho我添加了一些代码片段。 – turntwo 2014-11-24 11:55:46

回答

3

是,默认的会话管理器(使用文件)锁的会话文件当你在session_start并释放当你做session_write_close(或脚本结束)时。与此同时,其他脚本试图访问会话,等待发布。详细文章here或手册session-write-close

+0

我以为是这样。感谢您的确认。我试图使用框架的会话实现,而不是PHP的本地会话没有成功。但至少我可以继续将我的头撞向另一面墙。谢谢。 – turntwo 2014-11-24 13:42:07

相关问题