定時任務的實現
定時任務
關於定時任務有很多種實現方式,介紹一下了解過的三種,分別是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 標準錯誤輸出重定向等同於標準輸出,因為之前標準輸出已經重定向到了空裝置檔案,所以標準錯誤輸出也重定向到空裝置檔案。
相關文章
- Java如何實現定時任務?Java
- SpringBoot如何實現定時任務Spring Boot
- PHP定時執行任務的實現PHP
- [筆記]laravel定時任務的實現筆記Laravel
- linux實現一個定時任務Linux
- 基於redis實現定時任務Redis
- java springboot 實現定時器任務JavaSpring Boot定時器
- Linux中如何實現定時任務Linux
- Python實現定時任務的多種方式Python
- 使用Java實現定時任務排程Java
- Java定時任務實現優惠碼Java
- SpringBoot中併發定時任務的實現、動態定時任務的實現(看這一篇就夠了)Spring Boot
- Spring Boot 實現定時任務的 4 種方式Spring Boot
- Laravel5.6使用定時任務實現定時發郵件Laravel
- Laravel5.6 使用定時任務實現定時發郵件Laravel
- Laravel + Workerman 實現多程式定時器任務Laravel定時器
- springboot整合quarzt實現動態定時任務Spring Boot
- 使用者自定義定時任務的php實現PHP
- 在dotnet core實現類似crontab的定時任務
- Spring Boot 中實現定時任務的兩種方式Spring Boot
- Quartz - Spring整合Quartz實現叢集的定時任務quartzSpring
- springboot整合Quartz實現動態配置定時任務Spring Bootquartz
- Grails整合Quartz外掛實現定時任務(Job)AIquartz
- [奇思異想]使用RabbitMQ實現定時任務MQ
- Spring Boot系列之使用@Scheduled實現定時任務Spring Boot
- 定時任務
- 玩轉SpringBoot:SpringBoot的幾種定時任務實現方式Spring Boot
- springboot+quartz以持久化的方式實現定時任務Spring Bootquartz持久化
- 如何用 Java 實現 Web 應用中的定時任務?JavaWeb
- 直播系統原始碼,實現倒數計時,定時任務原始碼
- C#通過rabbitmq實現定時任務(延時佇列)C#MQ佇列
- Spring+quartz實現動態化定時任務 (轉)Springquartz
- Linux Crontab Shell指令碼實現秒級定時任務Linux指令碼
- Spring Boot之使用Scheduled註解實現定時任務Springboot
- 深入 Java Timer 定時任務排程器實現原理Java
- 如何實現簡單的定時全域性唯一任務?
- 【本人禿頂程式設計師】SpringBoot中併發定時任務的實現、動態定時任務的實現(看這一篇就夠了)程式設計師Spring Boot
- SpringTask定時任務Spring
- Oracle定時任務Oracle