定時任務的實現

定時任務

關於定時任務有很多種實現方式,介紹一下了解過的三種,分別是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 標準錯誤輸出重定向等同於標準輸出,因爲之前標準輸出已經重定向到了空設備文件,所以標準錯誤輸出也重定向到空設備文件。

發佈了33 篇原創文章 · 獲贊 15 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章