php定時執行操作及ob_flush()與flush()的使用
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
http://blog.csdn.net/qq_38125058
一: 每隔30s執行一次,將字符串寫入文件
// 30秒執行一次
ignore_user_abort(true); //即使Client斷開(如關掉瀏覽器),PHP腳本也可以繼續執行.
set_time_limit(0); // 執行時間為無限制,php默認執行時間是30秒,可以讓程序無限制的執行下去
$interval=30; //每隔30秒運行一次
do{
/**
**要執行的操作
*/
// file_put_contents("D://log.log",123,FILE_APPEND);//記錄日誌
sleep($interval); // 按設置的時間等待30秒循環執行
// 其他操作
}while(true);
註釋:file_put_contents(“D://log.log”,$msg,FILE_APPEND);方法的作用是:將一個字符串寫入文件。FILE_APPEND作用:如果文件已經存在,追加數據而不是覆蓋。
執行上述代碼,可看到每隔30s在log.log文件中寫入一個“123”的字符串。
二:每隔30s在頁面顯示字符串
// 30秒執行一次 ignore_user_abort(); //即使Client斷開(如關掉瀏覽器),PHP腳本也可以繼續執行. set_time_limit(0); // 執行時間為無限制,php默認執行時間是30秒,可以讓程序無限制的執行下去 $interval=30; // 每隔30秒運行一次 do{ // 要執行的操作 echo "string"; ob_flush();//把數據從PHP的緩沖(buffer)中釋放出來。 flush(); //把不在緩沖(buffer)中的或者說是被釋放出來的數據發送到瀏覽器。 sleep($interval); // 按設置的時間等待30秒循環執行 // 其他操作 }while(true);
flush() 函數不會對服務器或客戶端瀏覽器的緩存模式產生影響。因此,必須同時使用 ob_flush() 和flush() 函數來刷新輸出緩沖。順序是先ob_flush(),然後flush(),它們的作用是刷新緩沖區。
buffer是一個內存地址空間,Linux系統默認大小一般為4096(1kb),即一個內存頁。主要用於存儲速度不同步的設備或者優先級不同的 設備之間傳辦理數據的區域。通過buffer,可以使進程這間的相互等待變少。
當執行echo,print的時候,輸出並沒有立即通過tcp傳給客戶端瀏覽器顯示, 而是將數據寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的隊列,數據必須經過該隊列。當一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出數據交給系統內核交由tcp傳給瀏覽器顯示。所以,數據會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser
默認情況下,php buffer是開啟的,而且該buffer默認值是4096,即1kb。你可以通過在php.ini配置文件中找到output_buffering配置.當echo,print等輸出用戶數據的時候,輸出數據都會寫入到php output_buffering中,直到output_buffering寫滿,會將這些數據通過tcp傳送給瀏覽器顯示。你也可以通過 ob_start()手動激活php output_buffering機制,使得即便輸出超過了1kb數據,也不真的把數據交給tcp傳給瀏覽器,因為ob_start()將php buffer空間設置到了足夠大 。只有直到腳本結束,或者調用ob_end_flush函數,才會把數據發送給客戶端瀏覽器。
在沒有開啟緩存時,腳本輸出的內容都在服務器端處於等待輸出的狀態 ,flush()可以將等待輸出的內容立即發送到客戶端。
開啟緩存後,腳本輸出的內容存入了輸出緩存中 ,這時沒有處於等待輸出狀態的內容,你直接使用flush()不會向客戶端發出任何內容。而 ob_flush()的作用就是將本來存在輸出緩存中的內容取出來,設置為等待輸出狀態,但不會直接發送到客戶端 ,這時你就需要先使用 ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。
上述定時執行操作的代碼程序並沒有寫結束判斷語句,他會無限循環下去。
下面是改良方案:
三:30秒之後輸出字符串”123”,循環停止。
//30秒後執行一次
ignore_user_abort(); //即使Client斷開(如關掉瀏覽器),PHP腳本也可以繼續執行.
set_time_limit(0); // 執行時間為無限制,php默認執行時間是30秒,可以讓程序無限制的執行下去
$interval=30; // 每隔30秒運行一次
$status = 1;
while ($status) {
$status = 0;
sleep($interval);
echo "123";
ob_flush();//把數據從PHP的緩沖(buffer)中釋放出來。
flush(); //把不在緩(buffer)中的或者說是被釋放出來的數據發送到瀏覽器。
}
exit();
個人感覺php定時執行任務的效率不是很高,所以不推薦使用。
php定時執行操作及ob_flush()與flush()的使用