轉自:http://www.blhere.com/966.html
背景是這樣的:我需要一段PHP代碼去定期對數據庫操作,並把結果保存起來。如果方法是用戶請求的時候來觸發執行這個代碼,顯然用戶的響應時間變長,影響用戶體驗!如果利用操作系統的定時任務,執行頻率也是非常高的。
下面寫個簡單例子來講解這個方法。
|
1
2 3 4 5 6 7 8 9 10 |
<?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 內容如下:
|
1
2 3 |
<?php
return 1 ; //1執行腳本 0退出執行腳本 ?> |
改良腳本如下:
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?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 ( ) ; ?> |
