1

私は自分のサイトで AJAX を使用しており、サーバーによってダウンロードされているファイルの進行状況をユーザーに表示したいと考えています。

ダウンロードは、パーセンテージをシェルに出力するスクリプトによって行われます。この情報を AJAX を使用してユーザーに返したいと思います。これどうやってするの?

助けと指示をありがとう。

あなたの解決策が、テキストファイルへの書き込みとテキストファイルからのパーセンテージの取得を伴わないことを願っています!! オーバーヘッドが多すぎると思います。

編集 - 詳細情報

これは Linux シェル コマンド - Fedora Core 10 です。

現在、これはシェル出力がどのように見えるかです:

[download]   9.9% of 10.09M at 10.62M/s ETA 00:00

パーセンテージが変化し、それをキャプチャして、変化したときにユーザーに送り返したいと思います。

これを実行するには、PHP の exec() 関数を使用します。

4

3 に答える 3

0

私は同様の問題に取り組んでいます。ビデオ変換シェル スクリプトの出力を解析する必要があります。返された の出力を使用popenして解析しますresource。最初は使用fgetsしましたが、更新された値が新しい行として認識されませんでした。そこで、オプションを取る単純な関数を作成して、カリアージュ リターン$arg_delimiterなどの他の戻り値の型をチェックできるようにしましたchr(13)。私の場合、これらの関数はパーサー オブジェクトのメソッドであったため、サンプル コードは少し変更されているため、テストされていません。

function get_line ($arg_handle, $arg_delimiter = NULL)
{
  $delimiter = (NULL !== $arg_delimiter) ? $arg_delimiter : chr(10);
  $result    = array();

  while ( ! feof($arg_handle))
  {
    $currentCharacter = fgetc($arg_handle);

    if ($delimiter === $currentCharacter)
    {
      return implode('', $result);
    }

    $result[] = $currentCharacter;
  }

  return implode('', $result);
}

popen() resource次のような結果をループするだけです。

  $command = '/usr/bin/yourcommand';
  $handle  = popen($command . ' 2>&1', 'r');

  while ( ! feof($handle))
  {
    $line = get_line($handle, chr(13));

    preg_match($yourParserRegex, $line, $data);

    if (count($data) > 0)
    {
      printf("<script type='text/javascript'>\n  //<![CDATA[\n    window.alert('Result: %s');\n  // ]]>\n</script>"
            ,$data[1]
            );
      flush();
    }

  }

あとは、彗星のことを理解するだけです。

于 2009-06-17T00:57:34.770 に答える