1

所以我有一个用户填写的表单,提交时会打开一个新选项卡以加载结果 - 脚本遍历多个 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 在 results/index.php 页面完成之前不会返回 - 这完全违背了所有这一切的目的。是否有关于多个 php 脚本同时执行或使用相同资源的问题,这是我在这里坚持的?

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

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

4

1 回答 1

3

我曾经问过一个类似的问题,Sh​​ow progress for long running PHP script

关键是,会话不能共存。您不能同时在 2 个脚本上打开同一个会话,否则会触发错误。

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

于 2012-04-10T20:50:27.347 回答