PHP定時器實現每隔幾秒運行一次

php是服務器端腳本了並不像js那樣有專業的settimeout函數來定時執行了,但只要瀏覽器不關閉各階層是能夠作到了,下面一塊兒來看看。php

下面寫個簡單例子來說解這個方法。html

<?php 
ignore_user_abort();//關閉瀏覽器仍然執行
set_time_limit(0);//讓程序一直執行下去
$interval=3;//每隔必定時間運行
do{
    $msg=date("Y-m-d H:i:s");
    file_put_contents("log.log",$msg,FILE_APPEND);//記錄日誌
    sleep($interval);//等待時間,進行下一次操做。
}while(true);
?>linux

須要說明的是:程序沒有寫結束判斷語句,他會無限循環下去。固然若是想中止的話,能夠重啓apache,重啓後就無效了。想再次進行定時執行,那麼把這段代碼再一次運行。shell

上面簡單例子能夠說明這個原理。
那麼針對上面的例子,我能夠進行一下改良方案。apache

你須要一個執行腳本的開關,你能夠用外部文件引入的方法來實現,在while循環的時候,include開關變量便可。那麼就能夠這樣實現:瀏覽器

創建外部引入變量文件 switch.php 內容以下:緩存

<?php
return 1;//1執行腳本 0退出執行腳本
?>服務器

改良腳本以下:函數

<?php
    ignore_user_abort();//關閉瀏覽器後,繼續執行php代碼
    set_time_limit(0);//程序執行時間無限制
    $sleep_time = 5;//多長時間執行一次
    $switch = include 'switch.php';
    while($switch){
        $switch = include 'switch.php';
        $msg=date("Y-m-d H:i:s").$switch;
            file_put_contents("log.log",$msg,FILE_APPEND);//記錄日誌
        sleep($sleep_time);//等待時間,進行下一次操做。
    }
    exit();
    
?>post


固然咱們也可使用系統的定時執行php腳本了,下面看個linux的例子。

在Crontab中使用PHP執行腳本

就像在Crontab中調用普通的shell腳本同樣(具體Crontab用法),使用PHP程序來調用PHP腳本。 
每一小時執行myscript.php以下:

# crontab -e 
00 * * * * /usr/local/bin/php /home/john/myscript.php

/usr/local/bin/php爲PHP程序的路徑。

 

---------------------------------------------------------------------------------------------------

 

用PHP實現定時器功能

 

一、直接使用PHP來完成定時

複製代碼
<?php
ignore_user_abort(false);//當用戶關閉頁面時服務中止
set_time_limit(0);  //設置執行時間,單位是秒。0表示不限制。
date_default_timezone_set('Asia/Shanghai');//設置時區

while(TRUE)
{
    //這裏是須要定時執行的任務
    sleep($interval);//暫停時間(單位爲秒)
}
?>
複製代碼

 2.Linux/Unix的定時任務 定時直接能夠用cron來執行一個php腳本 或者其餘語言的腳本[你要有足夠的系統權限]

好比每隔5分鐘執行下 /root/bin目錄下的test.php腳本

*/5 * * * * php /root/bin/test.php

 

複製代碼
<?php    
   ignore_user_abort(true);//設置與客戶機斷開是否會終止腳本的執行。
  set_time_limit(0); //設置腳本超時時間,爲0時不受時間限制
  ob_end_clean();//清空緩存
  ob_start();//開始緩衝數據
  while(1){
   echo str_repeat(" ",1024);//寫滿IE有默認的1k buffer
   ob_flush();//將緩存中的數據壓入隊列
   flush();//輸出緩存隊列中的數據
   echo "now time is ".date('h:i:s') . "<br/>";//打印數據,實際上是先將數據存入了緩存中
   usleep(1000000);//延遲一秒(暫停一秒)
  }
?>
複製代碼

若是要求實現連續、均勻的輸出效果(如輸出時間),則應設置緩存,即便用圖a對應的方法;若是對輸出顯示的連續性要求不高,或者時間間隔比較大(如按期自動備份,定時加密控制等),則使用圖b對應的方法便可。

   爲方便理解,提供相關函數做用說明以下:
  ①ignore_user_abort(bool):設置與客戶機斷開是否會終止腳本的執行。
  ②set_time_limit(int seconds)設置容許腳本運行的時間,單位爲秒。參數值爲0時不受限制。
  ③ob_end_clean():清除服務端緩存的數據
  ④ob_start():開啓一個緩存(可嵌套)
   ⑤ob_flush():將緩存中的數據壓入隊列
  ⑥flush():輸出緩存隊列中的數據
  ⑦usleep(int m-seconds):以指定的微秒數延緩程序的執行。
  注:
  flush()和ob_flush()的正確順序應是,先ob_flush()再flush(),不可弄混。
  usleep()函數可替換成sleep()函數,不一樣之處在於sleep()的參數是秒。

FROM:http://blog.tianya.cn/blogger/post_read.asp?BlogID=4315093&PostID=42870088

          http://blog.uacool.com/?p=642

          http://dev.cobub.com/zh/docs/cobub-razor/auto-archiving/

相關文章
相關標籤/搜索