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パネルを監視して、機能を確認しています。

したがって、私の問題は、results / index.phpページが完了するまでgetProgress.phpが返されないことです。これにより、このすべての目的が完全に無効になります。複数のphpスクリプトが同じリソースを同時に実行または使用していることについて何かありますか?

LAMP/Ubuntuで新しいバージョンのapache/phpを実行しています。

補足/質問として、私はAJAX / php / mySQL / longポーリングを使用するマルチプレイヤーゲームを計画しているので、このトピックに特に興味があります。そのプロジェクトに挑戦するために知っておくべきことがあるかどうか知りたいです。 。

4

1 に答える 1

3

私は一度同様の質問をしました。長時間実行されているPHPスクリプトの進捗状況を表示します

重要なのは、セッションは共存できないということです。2つのスクリプトで同じセッションを同時に開くことはできません。1つはエラーをトリガーします。

あなたがすべきことは、データベーステーブルにステータスを書き込み、AJAX呼び出しでそれから読み取ることです。別のオプションは、APCキャッシュを使用することです。

于 2012-04-10T20:50:27.347 に答える