其實很簡單的,在做開發的過程中可能會遇到一些情況需要定時得去跑一些程序,這時呢我們就可以用到crontab這個定時器來幫助我們完成這些任務。
首先需要具體執行的PHP程序,分為兩種情況:
1、單獨的PHP文件(test.php)
<?php
$link = mysqli_connect("localhost","root","123456","test") or die("Error " . mysqli_error($link)); //連接,test為數據庫的名稱
$query = "SELECT name FROM userInfo" or die("Error in the consult.." . mysqli_error($link));//查詢
$result = mysqli_query($link, $query);//查詢的結果
while($row = mysqli_fetch_array($result)) {
echo $row["name"] . "<br>";
}
?>
這里是一個mysqli鏈接,鏈接數據庫、查詢結果并進行輸出,然后我們寫一個shell腳本來執行這個php程序(test.sh)
#!/bin/bash
php /Applications/MAMP/htdocs/localhosttest/test.php
注:執行此腳本時要把php加入環境變量
2、框架內的某個方法(以TP為例)
比如我們要執行index.php入口文件對應的模塊下的test控制器,下面的cron方法(源碼我就不寫了,畢竟每個人對應的場景不一樣),話不多說,直接上shell腳本(test.sh)
#!/bin/bash
url="http://test.com/index.php/test/cron"
groupfrom=(yx wz fz)
#for i in {1..12}
#do
#/usr/bin/curl $url"?year=2017-"$i"&groupfrom=fz"
#echo $url"?year=2017-"$i
#for f in ${groupfrom[@]}
#do
#/usr/bin/curl $url"?year=2017-"$i"&groupfrom="$f
#done
#done
#cur_date=`date +%Y-%m-%d`
years=(2017 2018)
for y in ${years[@]}
do
for m in {01..12}
do
/usr/bin/curl $url"?year="$y"-"$m
sleep 5s
for f in ${groupfrom[@]}
do
/usr/bin/curl $url"?year="$y"-"$m"&groupfrom="$f
sleep 5s
done
done
done
sleep 5s代表該腳本休眠5秒(腳本運行的時候每5s執行一次),測試的時候把/usr/bin/curl替換為echo,輸出的應該是一個正常的http地址,如果能正常訪問項目內的方法就可以了。
然后咱們寫一個crontab的定時任務,先簡單介紹一下五個星星分別表示什么,從前到后:
minute - 分鐘 ,從0到59之間的任何整數
hour - 小時, 從0到23之間的任何整數
day - 天, 從1到31之間的任何整數(如果指定了月份,必須是該月份的有效日期)
month - 月份, 從1到12之間的任何整數(或使用月份的英文簡寫如jan/feb等等)
dayofweek - 星期 , 從0到7之間的任何整數,這里的0到7代表星期日(或者星期的英文簡寫如sun/mon等等)
好,介紹完之后咱們開始寫(寫的時候注意要用root權限 sudo crontab -e )
*/15 * * * * /bin/sh /Applications/MAMP/htdocs/localhosttest/test.sh
PS:每15分鐘執行一次test.sh腳本 [即每個小時的第0 15 30 45 60分鐘執行命令,也可每分鐘,每小時,每天,每10天去執行一次 ],需要給test.sh和test.php 可執行的權限。(否則因為權限導致不執行)chmod +x test.php/test.sh
測試,執行成功!