利用 Linux crontab 定時執行 PHP

轉載自http://www.cnblogs.com/hujiong/archive/2012/12/15/2820028.html

啓動linux定時服務:service crond start

查看當前定時任務: crontab -l

添加新定時任務:crontab -e

 

先是測試crontab對於普通任務能否執行:

*/1 * * * * date >> /opt/web/mydate.log

保存後重啓crontab :
service crond restart

 

Crontab語法

usage:  crontab [-u user] file

        crontab [-u user] [ -e | -l | -r ]

                (default operation is replace, per 1003.2)

        -e      (edit user's crontab)

        -l      (list user's crontab)

        -r      (delete user's crontab)

        -i      (prompt before deleting user's crontab)

        -s      (selinux context)

 

       其中,file是命令文件的名字。如果在命令行中指定了這個文件,那麼執行crontab命令,則將這個文件拷貝到crontabs目錄下;如果在命令行中沒有制定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將他們也存放在crontab目錄下。

 

Crontab 格式說明

       我們可以用crontab -e 添加要執行的命令。 命令執行的結果,無論是標準輸出還是錯誤輸出,都將以郵件形式發給用戶。

      

   添加的命令必須以如下格式:

   * * * * * /command path

      

       前五個字段可以取整數值,指定何時開始工作,第六個域是字符串,即命令字段,其中包括了crontab調度執行的命令。 各個字段之間用spaces和tabs分割。

 

前5個字段分別表示:

       分鐘:0-59

       小時:1-23

       日期:1-31

       月份:1-12

       星期:0-6(0表示週日)

 

還可以用一些特殊符號:

       *: 表示任何時刻

       ,: 表示分割

  -:表示一個段,如第二端裏: 1-5,就表示1到5點

       /n : 表示每個n的單位執行一次,如第二段裏,*/1, 就表示每隔1個小時執行一次命令。也可以寫成1-23/1.

 

 

一些示例:

00 8,12,16 * * * /data/app/scripts/monitor/df.sh

30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

 

43 21 * * * 21:43 執行

15 05 * * *    05:15 執行

0 17 * * * 17:00 執行

0 17 * * 1 每週一的 17:00 執行

0,10 17 * * 0,2,3 每週日,週二,週三的 17:00和 17:10 執行

0-10 17 1 * * 毎月1日從 17:00到7:10 毎隔1分鐘 執行

0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 執行

42 4 1 * *     毎月1日的 4:42分 執行

0 21 * * 1-6   週一到週六 21:00 執行

0,10,20,30,40,50 * * * * 每隔10分 執行

*/10 * * * *        每隔10分 執行

* 1 * * *         從1:0到1:59 每隔1分鐘 執行

0 1 * * *         1:00 執行

0 */1 * * *        毎時0分 每隔1小時 執行

0 * * * *         毎時0分 每隔1小時 執行

2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 執行

30 5 1,15 * *       1日 和 15日的 5:30 執行

 

首先,確認 PHP 可執行文件的位置 —— 對於大多數 Linux 系統,幾乎肯定是 /usr/bin/php。如果不確定其位置,請在命令行中鍵入 which php 並查看響應內容。
其次,鍵入以下代碼,確保將 /usr/bin/php 替換爲 PHP 可執行文件的實際路徑。

1.<?php 
2.#!/usr/bin/php -q 
3.print date("Y-m-d H:i:s")."\n";  4.?> 
權限與轉碼

#chmod +x test.php
#dos2unix test.php

Crontab  -e

按其語法定義即可

例如5分鐘運行一次

 */5 * * * * /website/test.php >> /dev/null &

或者另外一種形式直接在Crontab中配置

*/2 * * * * /usr/bin/php -f  /var/www/html2 * * * * /usr/bin/php -f  /var/www/html/*.php
   表示每2分鐘執行一次/var/www/html/*.php文件
   (注: -f 很重要,不能修改成 -q )

 

crontab執行不了php的解決方法

用crontab跑php程序時,如何去調試,各人有各人的方法。我也有套方法,看一下,我是如何解決crontab執行不了php程序這個問題的。
一,php文件有沒有執行權限

  1. 1.[root@linux cron]# ls -al |grep del   

  1. 2. -rwxr-xr-x  1 zwh  ftpgroup  494 10-20 16:42 del_redis.php  
複製代碼

如果沒有X,說明沒有執行權限,當然也執行不了。如果你不知道你登錄的用戶所在的組是不是有權限,直接給所有組都加上權限就行了。方法如下:

  1. [root@linux cron]# chmod +x ./del_redis.php
複製代碼

二,如果有執行權限了,還是執行不了解決方法如下:

1,在php程序裏面寫log(例如:error_log()這個函數),這也是必須的,因爲crontab定時執行,要是沒有log,你怎麼知道程序執行的結果怎麼樣。這樣我們可以通過log來查看crontab執行的情況。

2,也可以直接在crontab裏面,將執行的結果輸出一個文件當中。然後在這個文件當中查看執行情況。例如:

  1. 1.*/10 * * * * /usr/local/php/bin/php /var/www/cron/del_redis.php >> /home/zhangy/cron.txt  
複製代碼

       3,用crontab來執行php,是不走apache,nginx,所以$_SERVER,$_ENV這類變量根本用不了。所以檢查一php     代碼中有沒有這類變量,如果有拿掉。

4,php的相對路徑問題

因爲有思維定勢在做怪,這個問題也是最容易忽視的。

  1. 1.include_once'./mysql.php';  
複製代碼

當php代碼中,用的是相對路徑時,只有進入到那個目錄下執行/usr/local/php/bin/php /var/www/cron/level_rank.php才能生效。這個問題我遇到過至少二次,但是再遇到時還是想不起來。解決方法如下:

  1. 1.*/10 * * * * cd /var/www/cron && /usr/local/php/bin/php /var/www/cron/level_rank.php  
複製代碼

也可以直接在php代碼中用絕對路徑

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