在另一个php脚本完成之前,Ajax不会返回

时间:2012-04-10 20:46:50

标签: php ajax session

所以我有一个用户填写的表单,当提交一个新选项卡打开以加载结果时 - 该脚本遍历多个XML文件 - 这可能是一个耗时的过程,因为该脚本中发生了很多事情(2 -10分钟)。我想要一些能够跟踪结果页面进度的AJAX,所以我做的是让结果页面更新用户的会话(你可能只想跳到我的问题的底部)示例:

$_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函数不完整 - 我一直在监视firebug中的.NET面板以验证功能。

所以我的问题是getProgress.php在结果/ index.php页面完成之前不会返回 - 这完全违背了所有这一切的目的。是否有一些关于多个PHP脚本同时执行或使用相同的资源,这是我在这里举行的?

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

作为旁注/问题,我对这个主题特别感兴趣,因为我正在计划一个使用AJAX / php / mySQL /长轮询的多人游戏,我很好奇是否有什么我应该注意冒险进入那个项目。

1 个答案:

答案 0 :(得分:3)

我曾经问过一次类似的问题Show progress for long running PHP script

关键是,会话不能共存。您无法同时在2个脚本上打开相同的会话,其中一个会触发错误。

您应该做的是将状态写入数据库表,并从您的AJAX调用中读取。另一种选择是使用APC缓存。