0

PHPスクリプトがバックグラウンドでしばらく処理されている間に何が起こっているのかをユーザーに表示したいので、JavascriptまたはJQueryを使用してtextAreaにレポートを印刷しようとしています。

そのため、setTimeout(...) を使用して textArea を自動的に更新し、クライアント側でその変数を取得して textArea に出力する処理中に、PHP スクリプトを介してセッションでレポート値を設定しようとしました。

これが私が使用したコードです:

/*
 * The client side javascript function that updates the textArea value.
 */
function updateReport() {
    var reportValue = '<?php echo( $_SESSION[ 'report' ] ); ?>';
    document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;

    setTimeout(function () {
        updateReport();
    }, 500);
}

クライアント側から Ajax(JQuery) リクエストを介して呼び出される php スクリプト:

<?php
    $report = "";

    for( $i = 0; $i < $number_of_items_to_process; $i++ ) {
        $report .= "- Processing a new item";
        $_SESSION[ 'report' ] = $report;    
        // .... Process some long code here.
    }
?>

しかし、 updateReport() は最初に呼び出されたときに一度だけ実行され、PHP スクリプトが完了すると再開されるようです。

これについて説明してもらえますか?

そして、私が望むものを達成する方法はありますか?

---------------------------------- >>更新: $ の更新された値を取得するために使用するコード_SESSION[ 'report' ] サーバー側から:

// 1. JavaScript :
function updateReport() {
    $.ajax({  
          url: "test2.php",  
          type: "POST",  
          cache: false,  
          success: function( returned_value ){
                var reportValue = $.trim( returned_value );
                alert(reportValue);  // All messages appear after PHP script ends.
          }
    });  

    setTimeout(function () {
        updateReport();
    }, 500);
}

// 2. test2.php(Script just made to get $_SESSION[ 'report' ]) :
<?php
    if ( !isset( $_SESSION ) ) session_start();
    echo( $_SESSION[ 'report' ] );
?>
4

3 に答える 3

2

test.php などの php サイトにアクセスすると、サーバーから html に変換され、Web ブラウザーに送信されます。

そう:

function updateReport() {
    var reportValue = '<?php echo( $_SESSION[ 'report' ] ); ?>';
    document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;

    setTimeout(function () {
        updateReport();
    }, 500);
}

Webブラウザに表示されます(firebugまたはchrome devツールでこれを調べることができます):

function updateReport() {
    var reportValue = '';
    document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;

    setTimeout(function () {
        updateReport();
    }, 500);
}

サイトにアクセスしたときに $_SESSION['report'] が空であるためです。

ajax リクエストを行うときは、サーバー上のコードを呼び出します。$_SESSION['report'] を設定すると、サーバーに設定されます。しかし、クライアント (Web ブラウザー) は PHP が何であるかを知らないため、クライアントはその情報を取得しません。ページリクエストで(PHPファイルから)生成されたhtmlのみを取得したため、空の文字列を何度も設定するだけです。

$_SESSION['report'] からクライアントに新しい値を取得するには、追加の Ajax リクエストを行う必要があります。

于 2012-06-12T09:46:53.537 に答える
1

HTTPストリーミングを使用してこれを行うことはできますが、この問題を解決するために少し異なる方法を選択します。

すべてのアイテムの処理には時間がかかるため、バックグラウンドプロセスで実行する必要があります。PHPでは、これをで行うことができますpcntl_fork()

まず、処理を開始する必要があります。

  1. ファイルfoobar.pidが存在するかどうかを確認します
  2. ファイルがない場合は作成し、そうでない場合は-goto 9
  3. キューから次のアイテムを選択
  4. アイテムを処理する
  5. foobar.pid「kill」が含まれている場合は、 8に進みます
  6. キューが空の場合:goto 8
  7. 後藤3
  8. ファイルを削除するfoobar.pid
  9. 終わり

これにより、バックグラウンドプロセスがチェックされます。そのようなプロセスはすでに1つ存在します。また、ファイル内に「kill」を入れることで、ループを停止することができます。

だから..レポートはどうですか?処理の一部として、ステータスメッセージをstatus.txtファイルに書き込むためのバックグラウンドサービスが必要です。

このファイルは、XHR(マーケティング担当者が呼ぶもの-AJAX)スクリプトで読み取ることができます。また、同じJavaScriptコードで、すべてのアイテムの処理が完了したかどうかを確認できます(foobar.pidファイルがなくなったため)。

于 2012-06-12T09:50:49.820 に答える
0

これを試してみるのはどうですか:

  1. http://www.silverspider.com/2005/php-progress-bar/
  2. http://www.redips.net/javascript/ajax-progress-bar/ - これには、進行状況バーの読み込みを確認できる機能デモがあります...
于 2012-06-12T09:46:57.173 に答える