为什么我的XHR调用等待彼此返回响应

时间:2014-11-24 09:49:48

标签: javascript php ajax apache session

我在一个页面中有一个iframe,它不断地在服务器上轮询一个会话变量,该变量正在被" main" XHR。

基本上是这样的:

  1. 主XHR运行并执行其操作,在运行时更新会话变量。通常需要一段时间,比如说超过10秒。

  2. 当主XHR正在运行时,我使用并行XHR请求轮询服务器以获取相同的会话变量。每当我收到投票XHR的回复时,我都应该更新前端视图。

  3. 问题在于,在主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;
                }
          }
    
    }
    

1 个答案:

答案 0 :(得分:3)

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