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.');
                });
            });
        });

こんにちは再びスタックオーバーフロー!

私が現在開発中のシステムには、実行速度が非常に遅く、場合によっては最大 20 秒かかるスクリプトがあります。(大量のフォルダの作成、大量のファイルの移動など)。それが、このスクリプトを設計した理由です。約 100 秒しか持続しない小さなダミータスクを作成しました。AJAX を使用してそのスクリプトを起動すると、一定量のタスクが完了します。タスクが完了するたびに、$_SESSION変数をスクリプトの進行状況で更新し、それを別の jQuery スクリプトでページにロードします。

しかし、それはちょっと奇妙に機能します。checkProgressTimeoutおよびダミータスクを起動すると思います(checkProgressTimeout関数を使用すると、500ミリ秒ごとに進行状況をチェックします)が、コンソールを見ると、イベントが発生するだけで、ダミータスクが完了するまで結果が得られないことがわかります。同じ timeval (500ms) で進行状況チェックをゆっくりと返します。

この問題は Google Chrome で発生します。スクリプトは IE ではまったく機能しません。

jsFiddle をセットアップしました: http://jsfiddle.net/nZAs4/2/。しかし、jsFiddle は PHP スクリプトをサポートしていないため、自分の Web ホストの 1 つに自分でアップロードする権限を取得しました。(Access-Control-Allow-Origin も許可しました)。

では、どうすればこれを機能させることができますか?

4

2 に答える 2

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 に答える