1. 程式人生 > >php定時執行操作及ob_flush()與flush()的使用

php定時執行操作及ob_flush()與flush()的使用

pri ber code log 顯示 doc 用戶數 lee 辦理

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

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()的使用