2012-04-10 87 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

相关问题