2012-11-27 99 views
0

我有一個帶睡眠功能的while循環,我不想運行 - >更新數據庫 - >睡眠 - >再次運行10次。使用下面的腳本,腳本循環10次,但只有當所有10個循環完成時才更新數據庫。帶睡眠循環的PHP直到循環結束時才更新數據庫

我在最後添加了一個回聲來驗證,並且回聲沒有出現在頁面上,直到每個迴路一次回顯出來。

我還試圖將使用ob_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循環
任何建議,將不勝感激。我經歷了搜索,沒有發現有類似問題的用戶,但我找不到答案。

+1

你無法一個一個得到回聲。 PHP所做的是一次輸出整個事物,而不是當時的一部分。因此,反過來,您將等待sleep()數秒,然後在屏幕上看到輸出。 –

+0

如果PHP僅在最後返回輸出,您是否會建議擁有一個秒循環腳本(循環調用此頁面)(每5秒調用一次頁面)? –

+0

這是一種方法,但我不知道你的實際目標是什麼。總有不止一種方法可以做,你應該描述你有什麼和你想要什麼,也許你會從其他人得到有用的輸入:) –

回答

0

正如指出的N.B.是PHP僅返回一次全部腳本運行後,我曾與下述溶液中結束:

運行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 

然後一個每分鐘運行一次頁面的cronjob。上述工作並解決了我的問題。

1

您可以將這些回聲逐個顯示出來,但是在受控環境下(根據php文檔,刷新可能會緩衝多個Win32系統上的輸出),您可以在php flush manual page中進一步閱讀。

更確切地說,請確保APaches mod_gzip已禁用,同時php_ini設置(如output_buffering和zlib.output_compression)應設置爲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 

在上述手冊頁的評論,你可以看到更多的例子。

+0

感謝您的信息。我決定使用bash腳本每5秒運行一次PHP腳本,而不是依靠清除PHP中的大緩衝區。不過,這是很好的知道:) –

1

看來,根據提供的代碼,所有更新都是在第一個循環中完成的,那麼mysql_fetch_array($ result)只返回False,並且內部循環不會在其他主循環中再次進行,除非您填充$再次產生(在循環標題之間)。

+0

這是如此真實。之前沒有注意到。感謝您糾正這一點。如果PHP不會一直等到腳本結束時纔回應所有內容,那麼我希望能夠解決這個問題。 –