2013-07-16 58 views
0
session_start(); 

    if(isset($_GET['progress'])){ 
     $status_done = '0'; 

     if($_SESSION['progress_percentage'] == "100"){ 
      $status_done = '1'; 
     } 

     echo json_encode(array(
      'progress_percentage' => $_SESSION['progress_percentage'], 
      'progress_status' => $_SESSION['progress_status'], 
      'progress_done' => $status_done 
      ) 
     ); 
    } 
    elseif(isset($_GET['dummytask'])){ 
     for ($i = 1; $i <= 100; $i++) { 
      $_SESSION['progress_percentage'] = $i; 
      $_SESSION['progress_status'] = 'Checking the locks and stuffing the dolls!'; 
      sleep(1); 
     } 
    } 
 $(document).ready(function(){ 
      var timeout = ''; 

      function checkProgress(){ 
       console.log('Checking progress event started'); 

       $.ajax({ 
        url: 'http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?progress&time='+ new Date().getTime(), 
        cache: false, 
        dataType: 'json' 
       }).done(function(data) { 
        $('#progressbar-progress').html(data.progress_status +'('+ data.progress_percentage +')'); 

        console.log('Progress checked'); 
        console.log(data); 

        if(data.progress_done == "1"){ 
         clearTimeout(timeout); 
        } 
       }).fail(function(jqXHR, status, error){ 
        console.log('Check Progress: Error: '+ error + status +''); 
       }); 

      } 

      function checkProgressTimeout(){ 
       checkProgress(); 
       console.log('Timeout tick for progress'); 

       timeout = setTimeout(checkProgressTimeout, 500); 
      } 

      $('#menu-open').click(function(event){ 
       checkProgressTimeout(); 

       console.log('starting dummy task'); 

       event.preventDefault(); 

       $.get('http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?dummytask', function(data) { 
        alert('Load was performed.'); 
       }); 
      }); 
     }); 

您好再次#1!檢查PHP腳本的進步與AJAX

我目前正在開發的系統的腳本運行速度很慢,有時可能會持續20秒。 (創建大量文件夾,移動大量文件等)。這就是爲什麼我設計了這個腳本。我創建了一個只需要持續〜100秒的小型dummytask。當我使用AJAX觸發該腳本時,它完成了一定數量的任務。每當任務完成時,我用腳本的進度更新我的$_SESSION變量,並用另一個jQuery腳本將它加載到我的頁面上。

但它有點奇怪。我認爲它確實啓動了checkProgressTimeout和虛擬任務(使用checkProgressTimeout函數每500毫秒檢查一次進度),但是當我查看控制檯時,我發現它只觸發事件但沒有得到任何結果,直到虛擬任務完成然後它用相同的timeval(500ms)慢速返回進度檢查。

Google Chrome中會出現此問題。該腳本在IE中完全不起作用。

我建立了一個jsFiddle:http://jsfiddle.net/nZAs4/2/。但由於jsFiddle不支持PHP腳本,我已經有權將其自己上傳到我自己的虛擬主機之一。 (我也允許訪問控制允許來源)。

那麼我該如何得到這個工作?

+0

'$ status_done = '0';'所以你添加字符串'0'這是毫無整數! 'String + String = StringString'。 'parseInt(StringString)= NaN(不是數字)' –

+1

您的會話數據只有在腳本完成時纔可用。你應該考慮更新數據庫,並關閉會話進行寫入以允許另一個腳本同時運行'session_write_close()'http://php.net/manual/en/function.session-write-close.php – Waygood

+0

@Bondye Can你解釋一下嗎?我沒有跟着。 – Thew

回答

1

由於N3rd決定複製和粘貼這裏是我的:

默認情況下,您的會話變量不訪問其他腳本,直到當前腳本終止。在完成處理會話數據以保留數據後,您必須調用session_write_close()

這可以如下進行:

  1. 啓動會話
  2. 創建此行書
  3. 更新您的會話記錄本記錄的索引數據庫的條目
  4. 關閉會話書寫session_write_close();
    • 這可以讓您的監控腳本開始工作
  5. 運行腳本(這需要年齡) 的處理部分,同時更新其進度

的監控腳本數據庫條目:

  1. 啓動會話(這將掛起,直到在另一個腳本中同一會話結束/寫關閉)
  2. 檢查會話爲索引的工作
  3. 從數據庫中獲取數據
  4. 進度顯示
  5. 關閉會話
+0

但是使用數據庫,不會爲腳本添加幾百毫秒的時間嗎? – Thew

+1

取決於你更新/檢查它的頻率。由於這是我在10分鐘+腳本上使用的方法,幾毫秒可以忽略不計 – Waygood

+0

好吧,正如我所說的腳本將持續20秒,有時甚至更長。 – Thew

1

默認情況下,直到腳本終止,您的會話變量纔會更新。您必須致電session_write_close()才能保存數據。

+0

我在哪裏放置'session_write_close()'?我是否必須將它放在session_start()之下,還是在更新會話之前或之後使用它?關於PHP.net的文檔不會告訴我這個... – Thew

+0

每當您將數據寫入會話並希望該數據可用於其他腳本時。不過,您可能必須重新打開會話才能再次關閉會話。 – n3rd