PHP 和 Linux,分別實現定時任務

參考:

PHP函數:https://blog.csdn.net/meimeieee/article/details/79556191 

Linux crontab:https://www.cnblogs.com/longjshz/p/5779215.html

第一種:PHP函數

這個可根據業務需求在項目後臺做成配置頁面,運營人員也可配置。

<?php
    //開始任務
	public function startCrond($id) {
		Db::name('crond')->where(['id' => $id])->setField('run', 1);
		$this->execCrond($id);
	}
	//終止任務
	public function abortCrond($id) {
		Db::name('crond')->where(['id' => $id])->setField('run', 0);
	}
	//執行任務
	public function execCrond($id) {
		ignore_user_abort(); //關掉瀏覽器,PHP腳本也可以繼續執行.
		set_time_limit(0); // 通過set_time_limit(0)可以讓程序無限制的執行下去
		do {
			$crond_info = Db::name('crond')->where(['id' => $id])->find();
			if (!$crond_info['run']) {
				die('process abort'); //終止任務
			}
			if (1 == $crond_info['type']) {
				//每過多少秒執行一次
				file_get_contents($crond_info['command']);
				Db::name('crond')->where(['id' => $crond_info['id']])->setInc('exec_count'); //自增累計執行次數
				sleep($crond_info['interval']); // 間隔
			} elseif (2 == $crond_info['type']) {
				//每天只執行一次
				$newDate = date("H:i"); //獲取當前時分,比對
				if ($crond_info['interval'] == $newDate) {
					file_get_contents($crond_info['command']);
					Db::name('crond')->where(['id' => $crond_info['id']])->setInc('exec_count'); //自增累計執行次數
					sleep(3600 * 24); // 間隔
				} else {
					sleep(60); // 間隔
				}
			}
		} while (true);
	}
	//任務1
	public function testCrond1() {
		Db::name('test')->insert(['crond_id' => '1', 'date' => date('YmdHis')]);
	}
	//任務2
	public function testCrond2() {
		Db::name('test')->insert(['crond_id' => '2', 'date' => date('YmdHis')]);
	}
	//任務3
	public function testCrond3() {
		Db::name('test')->insert(['crond_id' => '3', 'date' => date('YmdHis')]);
	}
CREATE TABLE `bs_crond` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1、以秒爲週期,2、以天爲週期',
  `interval` varchar(30) DEFAULT NULL COMMENT 'type=1:間隔秒數,type=2:每天的執行時間時分 示例12:10',
  `command` varchar(100) NOT NULL COMMENT '任務',
  `path` varchar(100) DEFAULT NULL,
  `exec_count` int(11) DEFAULT '0' COMMENT '累計執行統計',
  `run` varchar(10) DEFAULT '0' COMMENT '是否開始 1、正常執行,0、終止',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='週期任務';

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `crond_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=352 DEFAULT CHARSET=utf8mb4 COMMENT='測試表';

執行結果:

第二種:Linux 服務器上使用 CronTab

crontab的基本格式:

f1  f2  f3  f4  f5  command

分  時     日  月  周  命令

第一列f1代表分鐘1~59:當f1爲*表示每分鐘都要執行;爲*/n表示每n分鐘執行一次;爲a-b表示從第a分鐘到第b分鐘這段時間要執行;爲a,b,c,...表示第a,b,c分鐘要執行

第二列f2代表小時0~23(0表示凌晨):當f2爲*表示每小時都要執行;爲*/n表示每n小數執行一次;爲a-b表示從第a小時到第b小時這段時間要執行;爲a,b,c,...表示第a,b,c小時要執行

第三列f3代表日1~31:含義如上所示,以此類推

第四列f4代表月1~12:含義如上所示,以此類推

第五列f5代表星期0~6(0表示星期天):含義如上所示,以此類推

第六列command代表要運行的命令

命令參數:

crontab    -l   在標準輸出上顯示當前的crontab
crontab    -r   刪除當前的crontab文件
crontab    -e  編輯當前的crontab文件 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章