9

1時間ほど実行するスクリプトがあります。私は2つのWebホストを持っています。そのうちの1つで出力をリアルタイムで見ることができます(100万回ループしてエコーします)が、他のWebホストでは、スクリプトの実行が終了するまで待たなければ出力が表示されません全て。

出力をリアルタイムで表示するように設定を変更するにはどうすればよいですか? これはphp.iniのことだと思います。

コードの追加: このコードは、最初のサーバーで実行中に出力されますが、2 番目のサーバーでは出力されません。追加情報、1015 の値を低くすると、最初のサーバーは出力を待機します。したがって、最初のサーバーは 1015 文字ごとにフラッシュしているようですが、2 番目のサーバーはそうではありません。

while ($a++ < 5) {
  $b = 0;
  while ($b++ < 1015) {
    echo "H";
  }
  echo "<br><br>\n";
  sleep(1);
}

私の 2 番目のサーバーでは、出力バッファリングがオフになっています。

4

2 に答える 2

9

これは、出力バッファリングに関連しています。出力バッファリングがオンになっている場合、出力はすぐにクライアントに送信されませんが、一定量のデータがバッファリングされるまで待機します。これは通常パフォーマンスを向上させますが、あなたのような問題を引き起こします。

単純なソリューションでは設定を変更する必要はありませんがphp.ini、スクリプトの先頭にこれを配置するだけです。

<?php
  while (@ob_end_flush());
?>

これにより、すべての出力バッファリングが一度にフラッシュされて無効になります。

(出典:http ://www.php.net/manual/en/function.ob-end-flush.php#example-460 )

また、出力制御に関するPHPマニュアルを読むこともできます。関連するphp.ini設定はここにリストされています。

物事が送信されていることを確認したい場合(つまり、時間のかかるタスクの前)、flush()適切な時間に電話してください。


編集:

実際、特にContent-Typeが明示的に設定されていない場合、ブラウザーには独自のバッファーがある場合があります(ブラウザーは、ファイルのMIMEタイプをスニッフィングする必要があります)。この場合、ブラウザの動作を制御することはできません。

それを解決する可能性のある1つの方法は、Content-Typeを明示的に設定することです。

header("Content-Type: text/plain"); // if you don't need HTML
// OR
header("Content-Type: text/html");

ただし、これが機能することは保証されていません。Firefoxで動作しますが、Chromeでは動作しません。

とにかく、最終的なコードは次のようになります。

header("Content-Type: text/html"); // Set Content-Type
while (@ob_end_flush()); // Flush and disable output buffers
while ($a++ < 5) {
  $b = 0;
  while ($b++ < 1015) {
    echo "H";
    //flush(); // In fact because there is no significant delay, you should not flush here.
  }
  echo "<br><br>\n";
  flush(); // Flush output
  sleep(1);
}
于 2013-03-10T05:39:40.160 に答える
2

flush定期的に電話してみてください。出力バッファリングを使用している場合は、シーケンスob_end_flushまたはを使用してこれをオフにすることもできob_flushます。

于 2013-03-10T05:39:03.337 に答える