定時任務的實現

geeyeek發表於2016-03-02

定時任務

關於定時任務有很多種實現方式,介紹一下了解過的三種,分別是mysql的事件排程器,linux的cron計劃任務,以及使用php實現。


mysql

自MySQL5.1.6起,增加了一個非常有特色的功能–事件排程器(Event Scheduler),可以用做定時執行某些特定任務(例如:刪除記錄、對資料進行彙總等等),來取代原先只能由作業系統的計劃任務來執行的工作。MySQL的事件排程器可以精確到每秒鐘執行一個任務,而作業系統的計劃任務就如上面提到的cron只能精確到每分鐘執行一次。

我們要先看下event_scheduler是否已經開啟:
SHOW VARIABLES LIKE ‘event_scheduler’;

SELECT @@event_scheduler;

SHOW PROCESSLIST;
如果是關閉狀態的話,執行以下語句開啟:
SET GLOBAL event_scheduler = ON;

隨後執行語句(例句):

CREATE EVENT st_to_deal ON SCHEDULE EVERY 1 DAY
DO UPDATE apply set state = 1 where state = 0

php(轉)

ignore_user_abort()函式搭配set_time_limit(0)和sleep($interval)即可實現以上自動更新。

<?php
ignore_user_abort(); // run script. in background
set_time_limit(0); // run script. forever
$interval=30; // do every 15 minutes...
do{
$fp = fopen('text3.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // wait 15 minutes
}while(true);
?>

首先執行該程式,然後關閉該頁面,程式仍然執行中,test會每隔30秒的填補到text3.txt檔案。

在 PHP 內部,系統維護著連線狀態,其狀態有三種可能的情況:

0 - NORMAL(正常)
1 - ABORTED(異常退出)
2 - TIMEOUT(超時)

當 PHP 指令碼正常地執行 NORMAL 狀態時,連線為有效。當遠端客戶端中斷連線時,ABORTED 狀態的標記將會被開啟。遠端客戶端連線
的中斷通常是由使用者點選 STOP 按鈕導致的。當連線時間超過 PHP 的時限時,TIMEOUT 狀態的標記將被開啟。

可以決定指令碼是否需要在客戶端中斷連線時退出。有時候讓指令碼完整地執行會帶來很多方便,即使沒有遠端瀏覽器接受指令碼的輸出。預設的情況是當遠端客戶端連線中斷時指令碼將會退出。該處理過程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 設定中對應的”php_value ignore_user_abort”以及 ignore_user_abort() 函式來控制。如果沒有告訴 PHP 忽略使用者的中斷,指令碼將會被中斷,除非通過 register_shutdown_function() 設定了關閉觸發函式。通過該關閉觸發函式,當遠端使用者點選 STOP 按鈕後,指令碼再次嘗試輸出資料時,PHP將會檢測到連線已被中斷,並呼叫關閉觸發函式。

指令碼也有可能被內建的指令碼計時器中斷。預設的超時限制為 30 秒。這個值可以通過設定 php.ini 的 max_execution_time 或 Apache .conf 設定中對應的”php_value max_execution_time”引數或者 set_time_limit() 函式來更改。當計數器超時的時候,指令碼將會類似於以上連線中斷的情況退出,先前被註冊過的關閉觸發函式也將在這時被執行。在該關閉觸發函式中,可以通過呼叫 connection_status() 函式來檢查超時是否導致關閉觸發函式被呼叫。如果超時導致了關閉觸發函式的呼叫,該函式將返回 2。

需要注意的一點是 ABORTED 和 TIMEOUT 狀態可以同時有效。這在告訴 PHP 忽略使用者的退出操作時是可能的。PHP 將仍然注意使用者已經中斷了連線但指令碼仍然在執行的情況。如果到了執行的時間限制,指令碼將被退出,設定過的關閉觸發函式也將被執行。在這時會發現函式 connection_status() 返回 3。


cron

啟動

1.在系統中有service這個命令時:
這個命令在red hat當中常用,有的linux發行版本中沒有這個命令
$ service crond start //啟動服務
$ service crond stop //關閉服務
$ service crond restart //重啟服務

2.linux發行版本沒有service這個命令時:
/etc/init.d/cron stop
/etc/init.d/cron start

編寫shell指令碼

執行需要執行的任務

加入計劃任務

crontab -e 編輯當前使用者的cron任務
格式:

0 */4 * * * /etc/myplan/cron.daily.plan/papapa.sh 1> /dev/null 2>&1

前面的

0 */4 * * *

代表每隔四小時的0分的時候執行一次,以此類推,後面三個星為日、月、星期

編輯後cron服務應該是不需要重啟就生效的

順帶解釋
1>/dev/null 表示標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端。
2>&1 標準錯誤輸出重定向等同於標準輸出,因為之前標準輸出已經重定向到了空裝置檔案,所以標準錯誤輸出也重定向到空裝置檔案。

相關文章