2014-11-24 137 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

相關問題