PHP腳本定時任務實現及crontab實現定時任務

由於PHP只能被用戶觸發,被調用,調用後會自動退出內存,沒有常駐內存。所以實現定時任務都是循環的執行某一個腳本。
PHP定時任務實現主要有兩個方向:
1、循環腳本本身或腳本中代碼循環執行
2、服務器定時調用php
先主要介紹php腳本循環執行方案:
方案1:
腳本中的代碼循環執行。這種方法會佔系統資源, 長時間運行,會有一些意想不到的隱患。比如內存管理方面的問題 。
eg:

//文件config.php
<?php
	return true;


//文件test.php
<?php
	ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行.  
	set_time_limit(0);// 通過set_time_limit(0)可以讓程序無限制的執行下去,避免超時報錯 
	$times=5;// 每隔5秒運行一次
	do{
		$run = include 'config.php';//開關
		if($run){
			echo time().'<br>';
			ob_flush();//將數據從php的buffer中釋放出來
			flush();//將釋放出來的數據發送給瀏覽器,這裏必須要有這兩個函數,不然無法輸出時間戳,因爲該腳本一直未執行完,具體可以參考http://blog.csdn.net/qq_21386275/article/details/65634786
			sleep($times);// 等待5秒
		}else{
			die('end');
		}
	}while(true);

方案二:
循環執行腳本,而不是腳本中的代碼。
eg:

<?php
$isOn = 0;//開關
if($isOn){
	$time=2;
	$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
	echo time();
	//這裏不需要下邊兩個函數,因爲每一次echo都是腳本已經執行完了,具體參考http://blog.csdn.net/qq_21386275/article/details/65634786
	//ob_flush();
	//flush();
	sleep($time);
	echo "<script language='javascript' type='text/javascript'>";  
	echo "window.location.href='$url'";  
	echo "</script>";
	//file_get_contents($url);  //實際循環腳本使用該函數或者curl函數
}else{
	die('end');
}

方案三
crontab定時任務
**1、**安裝crontab

yum -y install vixie-cron
yum -y install crontabs

說明:
vixie-cron 軟件包是 cron 的主程序;
crontabs 軟件包是用來安裝、卸載、或列舉用來驅動 cron 守護進程的表格的程序。

**2、**配置
cron 是 linux 的內置服務,但它不自動啓動,可以用以下的方法啓動、關閉這個服務:

service crond start     //啓動服務
service crond stop      //關閉服務
service crond restart   //重啓服務
service crond reload    //重新載入配置
service crond status    //查看crontab服務狀態

在CentOS系統中加入開機自動啓動:

chkconfig --level 345 crond on

**3、**定時任務執行時間是寫在etc/crontab文件中,下邊示例是每天8點到21點,30分,訪問百度,定時執行任務的日誌是寫在var/log/cron文件中的

30 8-21 * * * root curl http://www.baidu.com

**4、**給php添加環境變量
①在/etc/profile文件最後一行添加 export PATH=$PATH:/data/php/bin
②執行source /etc/profile或者./profile讓其生效
③執行php -v驗證其生效,執行echo $PATH查看其設置的環境變量

**5、**添加定時任務,直接編輯/etc/crontab

29 8-21 * * * root curl http://www.baidu.com
#28 8-21 * * * root /data/php/bin/php /data/html/test.php
#28 8-21 * * * root /data/html/test.php

附:關於crontab相關說明
① /etc/crontab文件說明
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出現錯誤,或者有數據輸出,數據作爲郵件發給這個帳號
HOME=/ //使用者運行的路徑,這裏是根目錄
②run-parts使用
"run-parts"這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名了

01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的腳本

③相關規則說明
這裏寫圖片描述
④cron服務每分鐘不僅要讀一次/var/spool/cron內的所有文件,還需要讀一次/etc/crontab,因此我們配置這個文件也能運用cron服務做一些事情。用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務
⑤關於crontab權限,相關更深入理解,這裏不做闡述,可自行查訊資料,可參考https://www.cnblogs.com/xingzc/p/5969777.html

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