jquery progressbar – загружает все сразу

Я хотел бы иметь индикатор выполнения jQuery, который обновляется в зависимости от состояния запроса на стороне сервера. Я основываю этот код на этом учебнике, но он использует файл-загрузчик в качестве базы (такой же, как этот вопрос). Я не могу заставить его работать одинаково без загрузчика файлов. Проблема в том, что индикатор выполнения обновляется только после завершения process.php. Вместо того, чтобы асинхронно запрашивать обновление прогресса, он ожидает, что весь процесс будет выполнен. Я вижу только данные: предупреждение данных один раз.

Есть идеи?

Веб-страница:

<form id="upload-form" action='process.php' method="post" target="upload-frame"> <input type="hidden" id="uid" name="UPLOAD_IDENTIFIER" value="<?php echo $uid; ?>" > <input type="submit" value="Submit" /> </form> <div id="progressbar"></div> <iframe id="upload-frame" name="upload-frame" style="display:none"></iframe> 

Process.php – вызывается при отправке формы

 <?php session_start(); $varArray=array(1,2,3,4); $_SESSION['total']=count($varArray); foreach($varArray as $val){ $_SESSION['current']=$val; sleep(2); } ?> 

Javascript

 $(document).ready(function() { var started = false;// This flag determines if the upload has started $(function() { // Start progress tracking when the form is submitted $('#upload-form').submit(function() { $('#progressbar').progressbar();// Initialize the jQuery UI plugin // We know the upload is complete when the frame loads $('#upload-frame').load(function() { // This is to prevent infinite loop // in case the upload is too fast started = true; // Do whatever you want when upload is complete alert('Upload Complete!'); }); // Start updating progress after a 1 second delay setTimeout(function() { // We pass the upload identifier to our function updateProgress($('#uid').val()); }, 1000); }); }); function updateProgress(id) { var time = new Date().getTime(); // Make a GET request to the server // Pass our upload identifier as a parameter // Also pass current time to prevent caching $.ajax({ url: 'getProgress.php', type: "GET", cache: false, data: {'uid':id}, dataType: 'text', success: function(data){ alert("data: " + data); var progress = parseInt(data, 10); if (progress < 100 || !started) { // Determine if upload has started started = progress < 100; // If we aren't done or started, update again updateProgress(id); } // Update the progress bar percentage // But only if we have started started && $('#progressbar').progressbar('value', progress); } }); } }(jQuery)); 

getProgress.php – вызываемый по запросу ajax:

 <?php session_start(); if (isset($_REQUEST['uid'])) { if (isset($_SESSION['total']) && isset($_SESSION['current'])) { // Fetch the upload progress data $total = $_SESSION['total']; $current = $_SESSION['current']; // Calculate the current percentage $percent_done = round($current/$total*100); echo $percent_done; }else{ echo 100;// If there is no data, assume it's done } } ?> 

Solutions Collecting From Web of "jquery progressbar – загружает все сразу"

AFAIK, сеансы PHP фактически синхронны. Это означает, что скрипт Process.php блокирует выполнение скрипта getProgress.php, пока процесс Process.php не будет выполнен с сеансом.

Итак, что происходит:

  1. Process.php запускается и вызывает session_start ()
  2. Сервер предоставляет управление сеансом session_start ()
  3. getProcess.php запускается и вызывает session_start ()
  4. Сервер блокирует getProcess.php до тех пор, пока сеанс не будет использоваться.
  5. Process.php завершает и закрывает сеанс.
  6. Сервер возобновляет getProcess.php и дает ему контроль над сеансом.
  7. getProcess.php теперь видит, что процесс завершен.

См. http://www.php.net/manual/en/function.session-write-close.php .

Данные сеанса обычно сохраняются после завершения вашего сценария без необходимости вызова session_write_close (), но поскольку данные сеанса заблокированы для предотвращения одновременной записи, только один скрипт может работать в сеансе в любое время. […]

Я не тестировал следующий код, так как у меня нет доступа к серверу в данный момент, но я думаю, что он должен работать так:

 <?php $varArray=array(1,2,3,4); session_start(); $_SESSION['total']=count($varArray); session_write_close (); foreach($varArray as $val){ session_start(); $_SESSION['current']=$val; session_write_close (); sleep(2); } ?>