在 Linux 伺服器上定時執行 PHP 腳本(如資料備份、報表產生、郵件發送、快取清理)是常見的運維需求。Crontab 是 Linux 內建的排程器,功能強大且輕量。本文詳細說明設定步驟、常見陷阱與進階寫法。
crontab -e
首次執行會詢問選擇編輯器(建議選 vim 或 nano)。
在編輯器中新增一行:
0 * * * * /usr/bin/php -f /home/userxxx/update.php
:wq (vim) 或 Ctrl+O, Enter, Ctrl+X (nano)。系統會自動載入新規則。
錯誤寫法: 0 * * * * php -f /home/userxxx/update.php
正確寫法: 0 * * * * /usr/bin/php -f /home/userxxx/update.php
原因:Cron 執行環境不載入使用者的 PATH 環境變數,無法找到 php 指令。使用 which php 確認完整路徑。
| 欄位 | 說明 | 允許值 |
|---|---|---|
| MIN | 分鐘 | 0-59 |
| HOUR | 小時 | 0-23 |
| DOM | 日期 | 1-31 |
| MON | 月份 | 1-12 |
| DOW | 星期 | 0-6 (0=星期日) |
| CMD | 執行指令 | 任意合法指令 |
| 符號 | 用途 | 範例 | 含義 |
|---|---|---|---|
* | 任意值 | * * * * * | 每分鐘執行 |
- | 範圍 | 0 0-6 * * * | 每天 00:00~06:00 整點執行 |
, | 列舉 | 0,15,30,45 * * * * | 每小時 0, 15, 30, 45 分執行 |
/ | 間隔 | * */4 * * * | 每 4 小時執行一次 |
| 組合 | 範圍+間隔 | 0-10/2 * * * * | 每小時前 10 分鐘,每 2 分鐘執行 |
# 每天凌晨 2:30 備份資料庫 30 2 * * * /usr/bin/mysqldump -u root -p'password' dbname > /backup/db_$(date +\%Y\%m\%d).sql # 每週一上午 10:00 清理暫存檔 0 10 * * 1 /usr/bin/php -f /var/www/html/scripts/cleanup.php # 每月 1 號 00:00 產生月報 0 0 1 * * /usr/bin/php -f /var/www/html/scripts/monthly_report.php # 每 5 分鐘檢查服務狀態(需搭配鎖機制防重疊) */5 * * * * /usr/bin/flock -n /tmp/check.lock -c "/usr/bin/php -f /var/www/html/scripts/health_check.php"
> /var/log/myscript.log 2>&1flock 防止同一腳本重疊執行。#!/usr/bin/php 並賦予執行權限 chmod +x script.php,可簡化 crontab 寫法為 /path/to/script.php。grep CRON /var/log/syslog (Ubuntu/Debian) 或 /var/log/cron (CentOS/RHEL)。善用 Crontab 能自動化重複性運維工作,讓伺服器更穩定、開發者更專注於核心業務開發。