【问题标题】:Ajax doesn't return until another php script completes在另一个 php 脚本完成之前,Ajax 不会返回
【发布时间】:2012-04-23 04:25:35
【问题描述】:

所以我有一个用户填写的表单,提交时会打开一个新选项卡以加载结果 - 脚本遍历多个 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 的多人游戏,我很好奇是否有什么我应该注意的冒险进入那个项目。

【问题讨论】:

    标签: php ajax session


    【解决方案1】:

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

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

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

    【讨论】:

    • 我有点想,我最初尝试使用一个文件,我只是在两个脚本中打开,但它的行为方式也相同。我会试一试 db 表。
    • 你可以在没有 db 交互状态更新的情况下完成此操作。您可以使用 php 以百分比将数据传回 ajax 函数,然后使用它继续查询。
    • @Mike,考虑到这是两个不同的脚本试图访问相同的信息,不确定这将如何工作。
    • 无论如何都不要介意 DB 解决方案 - 我看到关于您的问题的评论建议使用 APC - 这是完美的,因为我的应用程序已经在使用 APC,所以这将是一个简单的解决方案!
    猜你喜欢
    • 2011-07-03
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多