如何設定 Windows 排程自動執行 PHP 程式

Windows 有內建「工作排程器」可以指定要執行的 PHP 檔案路徑。但是因為後續需要經常修改覺得麻煩,所以我改用 System Scheduler 設定要執行的 BAT 檔案,而 BAT 檔案內容可以透過  PHP 程式動態產生。

elePHPant by Atomic Taco 使用創用 CC BY-SA 授權

方法1: 工作排程器

Windows 系統管理工具 --> 工作排程器,詳細操作說明可參考 如何讓Server端自動執行PHP程式 | ucamcwindows10定時1分鐘執行php腳本,不使用windows的.bat文件 - IT閱讀

方法2: System Scheduler + BAT 檔案

1. 撰寫 BAT 檔案內容 (文章稍後說明)

2. 安裝 Splinterware - Scheduler

3. 開啟 System Scheduler 設定畫面
(1) 先輸入 Title 、在 Application 欄位選擇 BAT 檔案路徑

(2) 設定自動排程執行的時間


利用 BAT 檔案執行 PHP

BAT 檔案內容: PHP 路徑不一定要加上雙引號框住,但是如果路徑包含空格,則需要加上雙引號框住
c:\path\to\php.exe "c:\path\to\php_script.php"

或者如果需要傳入變數
c:\path\to\php.exe "c:\path\to\php_script.php" var1 var2

因為執行完視窗會自動關閉,不清楚是執行完成還是中途有執行失敗。BAT 檔案內容最後面加上 PAUSE 避免自動關閉:
c:\path\to\php.exe "c:\path\to\php_script.php"
PAUSE
過了幾天回去看伺服器,跳出幾十個視窗 (顯示為已崩潰狀態),雖然可以一次關閉全部視窗,但是這就失去察覺問題、解決問題的原意。如何讓 PHP 執行遇到問題時,視窗不要自動關閉,而正常執行則可以自動關閉。

The Will Will Web | 程式結束狀態: Windows 的 %ERRORLEVEL% 與 Linux 的 $? 提到
「在批次檔中只要取得 %ERRORLEVEL% 這個環境變數即可得知前一支程式所回傳的執行結果代碼,而且判斷的行為也與 Linux 完全相同,也就是代碼為 0 就代表正常結束,不等於 0 就代表執行過程發生錯誤。」
PHP 文件 PHP: exit - Manual 提到
exit(0); // 正常離開,回傳代碼 0
exit(1); // 回傳錯誤代碼 1
經測試 exit("「休士頓,我們有麻煩了!」") 錯誤訊息文字,其實是回傳代碼 0。

因此要讓 PHP 執行遇到問題,DOS 視窗不要自動關閉,而正常執行則可以自動關閉。 代表需要使用 exit(1) 或 trigger_error 函數,回傳錯誤代碼 1。在執行 exit(1) 之前需要吐出錯誤資訊方便理解。BAT 檔案改成:
@ECHO OFF
c:\path\to\php.exe "c:\path\to\php_script.php"
if NOT ["%errorlevel%"]==["0"] (
    PAUSE
    exit /b %errorlevel%
)

也許你會問為什麼不使用 monolog 來追蹤問題,這是個好問題~

方法3: Crontab

如果你偏好 Linux Crontab 寫法,安裝 Cygwin 的 crontab 相關套件理論上應該可以達到。

參考資料


留言