0
    session_start();

    if(isset($_GET['progress'])){
        $status_done = '0';

        if($_SESSION['progress_percentage'] == "100"){
            $status_done = '1';
        }

        echo json_encode(array(
            'progress_percentage' => $_SESSION['progress_percentage'],
            'progress_status' => $_SESSION['progress_status'],
            'progress_done' => $status_done
            )
        );
    }
    elseif(isset($_GET['dummytask'])){
        for ($i = 1; $i <= 100; $i++) {
            $_SESSION['progress_percentage'] = $i;
            $_SESSION['progress_status'] = 'Checking the locks and stuffing the dolls!';
            sleep(1);
        }
    }
        $(document).ready(function(){   
            var timeout = '';

            function checkProgress(){
                console.log('Checking progress event started');

                $.ajax({
                    url: 'http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?progress&time='+ new Date().getTime(),
                    cache: false,
                    dataType: 'json'
                }).done(function(data) {
                    $('#progressbar-progress').html(data.progress_status +'('+ data.progress_percentage +')');

                    console.log('Progress checked');
                    console.log(data);

                    if(data.progress_done == "1"){
                        clearTimeout(timeout);
                    }
                }).fail(function(jqXHR, status, error){
                    console.log('Check Progress: Error: '+ error + status +'');
                });

            }

            function checkProgressTimeout(){
                checkProgress();
                console.log('Timeout tick for progress');

                timeout = setTimeout(checkProgressTimeout, 500);
            }

            $('#menu-open').click(function(event){
                checkProgressTimeout();

                console.log('starting dummy task');

                event.preventDefault();

                $.get('http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?dummytask', function(data) {
                    alert('Load was performed.');
                });
            });
        });

再次您好 Stackoverflow!

我目前正在开发的系统的脚本运行速度很慢,有时可持续长达 20 秒。(创建大量文件夹、移动大量文件等)。所以这就是我设计这个脚本的原因。我创建了一个只持续约 100 秒的小型 dummytask。当我使用 AJAX 触发该脚本时,它会完成一定数量的任务。每次任务完成时,我都会$_SESSION使用脚本的进度更新我的变量,并使用另一个 jQuery 脚本将其加载到我的页面上。

但结果有点奇怪。我认为它确实启动了checkProgressTimeout虚拟任务(使用该checkProgressTimeout功能它每 500 毫秒检查一次进度),但是当我查看控制台时,我看到它只会触发事件但在虚拟任务完成之前不会得到任何结果,然后它以相同的时间(500 毫秒)缓慢返回进度检查。

在谷歌浏览器中会出现此问题。该脚本在 IE 中根本不起作用。

我已经建立了一个 jsFiddle:http: //jsfiddle.net/nZAs4/2/。但是由于 jsFiddle 不支持 PHP 脚本,我有幸自己将其上传到我自己的一个虚拟主机。(我也允许访问控制允许来源)。

那么我怎样才能让它工作呢?

4

2 回答 2

1

默认情况下,您的会话变量在脚本终止之前不会更新。您必须调用session_write_close()才能保留数据。

于 2013-07-16T10:13:16.953 回答
1

由于 N3rd 决定复制并粘贴这里是我的:

默认情况下,在当前脚本终止之前,其他脚本无法访问您的会话变量。完成会话数据处理后,您必须调用 session_write_close()以保留数据。

这可以按如下方式完成:

  1. 开始会话
  2. 为此运行脚本创建数据库条目
  3. 更新您的会话以记录此记录的索引
  4. 关闭会话以进行写作session_write_close();
    • 这允许您的监控脚本开始工作
  5. 运行脚本的处理部分(这需要很长时间),同时使用其进度更新 db 条目

在监控脚本上:

  1. 开始会话(这将挂起,直到另一个脚本中的同一会话完成/写入关闭)
  2. 检查会话以获取作业索引
  3. 从数据库中获取数据
  4. 显示进度
  5. 关闭会话
于 2013-07-16T10:20:21.267 回答