2012-04-10 55 views
1

所以我有一個用戶填寫的表單,當提交一個新的標籤打開以加載結果時 - 該腳本迭代了多個XML文件 - 這可能是一個耗時的過程因爲劇本中發生了很多事情(2-10分鐘)。我想要一些AJAX將跟蹤結果頁面的進度所以我所做的就是我有結果頁面更新用戶的會話(你可能只是想跳到下我的問題)舉例:Ajax直到另一個php腳本完成纔會返回

$_SESSION['fileCount'] = $fileCount; 
for($i=0;$i<fileCount;$i++){//iterate through xmls 
    $_SESSION['curFile'] = $xml[...]; 
    $_SESSION['curCount'] = $i; 
    //Do stuff 
} 

父頁面上的表格標記看起來像:

<form action="results/" method="post" onsubmit="openProgressDialog()" target="_blank"> 

上面的函數看起來像:

function openProgressDialog(user){ 
     $('#loadSplash').dialog('open'); 
     var loading = true; 
     var sleep = 50; 
     var precent = 0; 
     var fileCount = 0; 
     var i = 0; 
     var curFile = ''; 
     while(loading){ 
      $.getJSON('php/getProgress.php?u='+user, function(data) { 
       var items = []; 
       $.each(data, function(key, val) { 
        if(key == 'fileCount') 
         fileCount = val; 
        else if(key == 'curCount') 
         i = val; 
        else if(key == 'curFile') 
         curFile = val; 
       }); 
       if(fileCount > 0){ 
        //Do stuff 
        $('#pregressbar').progressbar('value',(i/fileCount)*100); 
        if(i == fileCount){ 
         sleep = 0; 
         loading = false; 
        } 
       } 
      }).delay(sleep); 
     } 
    } 

最後是在getProgress.php樣子:

<?php 
session_start(); 
$progress =array('fileCount' =>intval($_SESSION['fileCount']),'curCount' =>intval($_SESSION['curCount']),'curFile'=>$_SESSION['curFile']); 
echo json_encode($progress); 
?> 

所以我知道我只是使用了僞代碼和真實代碼的奇數組合,我也知道JS函數是不完整的 - 我一直在螢火蟲中監視NET面板以驗證功能。

所以我的問題是,getProgress.php不會返回,直到結果/ index.php頁面完成 - 這完全打敗了這一切的目的。是否有關於多個php腳本同時執行或使用相同的資源的東西,這是我在這裏舉行?

我正在LAMP/Ubuntu上運行apache/php的新版本。

作爲一個附註/問題,我對這個話題特別感興趣,因爲我正在計劃一個使用AJAX/php/mySQL/long polling的多人遊戲,我很好奇如果有什麼我應該知道的冒險進入該項目。

回答

3

我已經問了一個類似的問題Show progress for long running PHP script

問題是,會話不能共存。您無法同時在兩個腳本上打開同一個會話,但會觸發一個錯誤。

你應該做的是將狀態寫入數據庫表,並從你的AJAX調用中讀取。另一種選擇是使用APC緩存。

+0

我有種想法,我最初試圖用一個文件,我只是在兩個腳本中打開,但它也表現了相同的方式。我會給db表一個鏡頭。 – jreed121 2012-04-10 21:01:28

+0

你可以在沒有db交互的情況下完成狀態更新。你可以使用php以百分比的形式傳回數據到ajax函數,然後用它繼續查詢。 – gorelative 2012-04-10 21:06:37

+0

@Mike,不知道這是如何工作,考慮到它是兩個不同的腳本試圖訪問相同的信息。 – jreed121 2012-04-10 21:10:17

相關問題