0

データベースのテーブルを埋めるために長い仕事をしています。このジョブは、完了するまでにさまざまな時間がかかる場合があります。だから、プログレスバーが必要です。ページを数えるだけで十分です。私がいくつかの解決策を見つけた限り:

  1. _SESSION を使用します。OK、私が使用したほとんどのサーバーで動作しますが、クロムでの ERR_RESPONSE_HEADERS_TOO_BIG エラーに関する多くの問題があり、ループで呼び出された session_start/session_write_close が原因で、一部のサーバーで「ヘッダーが既に送信されました」という問題が発生することがあります。私はこの方法が好きでしたが、今では拒否しています
  2. 長い操作のループ内で一種の ob_start/ob_end_flush を使用します。これはうまくいきません。スクリプトの終了後にバッファリングされたすべてのエコーされたメッセージを表示するだけです。
  3. db を使用して共有変数を格納する (まだ試していません)
  4. 別の (一時) ファイルを使用します。(まだ試していません)。

私はすでにインフラストラクチャを実装しています: 長いジョブ (db にテーブルを作成する) 用のスクリプトと、進行状況を含む共有変数を読み取るために JS によって使用される別のスクリプトです。これらのスクリプトは両方とも、結果が .done 関数になることを期待して jQuery .ajax メソッドで呼び出しました。

他の方法はありますか?4) バリアントを使用したいようですが、プログレス バーを実装するための通常の方法を知りたいです。

ありがとう:)

4

3 に答える 3

0

セッションを使用するのがよい方法ですが、ユーザーが誤ってブラウザを閉じた場合はどうなりますか? その後、進行状況バーが初期状態にリセットされます。また、ヘッダーが送信される前にhtmlをエコーし​​ているため、エラーが発生しています。

したがって、私の意見では、進行状況をテーブル (データベース) に保存し、ユーザーがページにアクセスするたびにテーブルからそれを引き出して、完了した作業の割合を表示するのが最善の方法です。

手順:

1. Default State In Table: 0 - indicates that user has not filled out anything 
2. User Fills out page 1 update progress in table: 1 - indicates user completed page 1
3. User Fills out page 2 update progress in table: 2 - indicates user completed page 2

これをパーセンテージで表示するには、次のようにします。

$total = 3; //total pages that user needs to fill out
$filledOut = $db->getUserProgressStatus(); //return the digit status of user progress
$percent = ($filledOut / $total) * 100; //gives you % value 

これは、各ページで得られる値です。

Page 1: (0 / 3) * 100 = 0%
Page 2: (1 / 3) * 100 = 33% //first page completed
Page 3: (2 / 3) * 100 = 67% //second page completed
Page 4 (summary page): (3 / 3) * 100 = 100% //completed
于 2013-06-19T13:34:15.787 に答える
0
function fcflush()
{
    static $output_handler = null;
    if ($output_handler === null) {
        $output_handler = @ini_get('output_handler');
    }
    if ($output_handler == 'ob_gzhandler') {
        // forcing a flush with this is very bad
        return;
    }
    flush();
    if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
        @ob_flush();
    } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
        @ob_end_flush();
        @ob_start();
    }
}

//infinite loop example of usage
$counter = 0;
while (true) {
    echo $counter."<br />";
    fcflush();
    $counter++;
}
于 2013-06-19T13:42:34.527 に答える
0

まず、PHP コードを別のプロセスとして実行します。

 <?php 

 exec('/usr/bin/php /Path/to/script.php  {$param1} {$param2} > /dev/null 2>/dev/null &'); 

 ?>

次に、このプロセスを取得して、ユーザーの ID に対する進行状況で DB を更新します。その後、タイムアウト関数内で ajax 呼び出しを使用して、状態 (完了した DB 書き込みの数、残りの数など) を取得できます。 DB。

于 2013-06-19T13:37:50.013 に答える