0

実行したくないスリープ機能を備えた while ループがあります -> データベースの更新 -> スリープ -> 再度 10 回実行します。以下のスクリプトでは、スクリプトは 10 回ループしますが、10 回のループがすべて終了したときにのみデータベースを更新します。

確認のために最後にエコーを追加しましたが、すべてのループが一度にエコーアウトされるまで、エコーはページに表示されません。

また、エコーの後にob_flush()flush( ) を配置しようとしましたが、うまくいきませんでした。

脚本

$loops = 10;
while ($loops > 0)
{
  while($row = mysql_fetch_array($result))
  {
    // Get current User status
    $username = $row['username'];
    $user_status = $row['user_status'];
    $user_updated = date('Y-m-d H:i:s');

    // Update database
    $update_sql = "UPDATE  `database`.`user` SET  `user_status` =  '$user_status',
                                                  `user_updated` =  '$agent_updated'
                                            WHERE  
                                                  `user`.`username` =  '$username'";
    $update=mysql_query($update_sql);
    echo "Loop #".$loops."<br>";
  }
flush();
$loops--;
Sleep(5);
}

FOR ループでも同じことを試しました。
任意の提案をいただければ幸いです。検索を行ったところ、同様の問題を抱えているユーザーは見つかりませんでしたが、答えが見つかりませんでした.

4

3 に答える 3

1

提供されたコードによると、すべての更新は最初のループで行われ、mysql_fetch_array($ result)はfalseのみを返し、$ resultを再度入力しない限り、内部ループは他のメインループで続行されないようです(間whileサイクルヘッダー)。

于 2012-11-27T16:51:58.373 に答える
1

これらのエコーを 1 つずつ表示することができますが、制御された環境 (php のドキュメントによると、フラッシュは複数の Win32 システムで出力をバッファリングする場合があります) では、php フラッシュのマニュアル ページでさらに読むことができます。

具体的には、APaches mod_gzip が無効になっていることを確認し、output_buffering や zlib.output_compression などの一部の php.ini 設定を false に設定する必要があります。

output_buffering = false
zlib.output_compression = false

これらすべてを使用しても、実際に新しいデータを表示するブラウザを作成するには、「大量の」データ (2048 文字など) を送信する必要がある場合もあります。

echo "One"
echo str_repeat(" ", 2048);
Sleep(3)
echo "Two"
echo str_repeat(" ", 2048);
// Ans so on

前述のマニュアルページのコメントで、さらに多くの例を見ることができます。

于 2012-11-27T16:33:08.547 に答える
0

PHP はスクリプトの実行後に一度に結果を返すだけであることが指摘されてN.B.いるように、次の解決策で終了しました。

PHP ページを 5 秒ごとに実行する bash.sh スクリプト:

#!/bin/bash

set -e
count=1
while [ $count -le 12 ] :
do
  # run this scripts for one minute (12 times every 5 seconds = 60 seconds)
  /usr/bin/php -q thescript.php
  (($count++))
sleep 5
done

次に、ページを毎分実行する cron ジョブ。上記は機能し、私の問題を解決します。

于 2012-11-28T23:22:59.703 に答える