php是服務器端腳本了並不像js那樣有專業的settimeout函數來定時執行了,但只要瀏覽器不關閉各階層是可以做到了,下面一起來看看。
下面寫個簡單例子來講解這個方法。
<?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); ?>
需要說明的是:程序沒有寫結束判斷語句,他會無限循環下去。當然如果想停止的話,可以重啟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(); ?>
當然我們也可以使用系統的定時執行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實現定時器功能
1、直接使用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()的參數是秒。
感謝一下,如原作者不願摘取,請qq聯系本人:
https://www.cnblogs.com/kenshinobiy/p/5895299.html
參考:
FROM:http://blog.tianya.cn/blogger/post_read.asp?BlogID=4315093&PostID=42870088
http://dev.cobub.com/zh/docs/cobub-razor/auto-archiving/