在 Windows 伺服器定時執行 PHP 腳本(如資料備份、報表生成、快取清理),不依賴 Linux crontab。
<?php
// timer.php
$fp = fopen('timer.log', 'a+');
fwrite($fp, date('Y-m-d H:i:s') . " 任務執行成功!\n");
fclose($fp);
// 可放心使用 include、require、資料庫操作等
?>
@echo off
D:\php\php.exe -q D:\www\timer.php
REM 路徑請改為實際 PHP 執行檔與腳本絕對路徑
-q:抑制 HTTP 標頭輸出(CLI 模式預設不輸出,加上更保險)。timer.bat右鍵任務 → 「執行」 → 檢查 timer.log 是否寫入成功。
.bat 執行時會彈出 CMD 黑框,影響使用者體驗或被誤關閉。.vbs 可完全隱藏視窗。
DIM objShell
SET objShell = WScript.CreateObject("WScript.Shell")
' 參數:命令字串, 視窗模式(0=隱藏), 是否等待完成
iReturn = objShell.Run("D:\php\php.exe D:\www\timer.php", 0, TRUE)
SET objShell = NOTHING
其餘步驟同 .bat 方案。執行時無任何視窗彈出,背景靜默完成。
CLI 模式預設讀取 php.exe 同目錄下的 php.ini。若報錯缺少擴展,可在 .bat 中指定:
D:\php\php.exe -c D:\php\php.ini -q D:\www\timer.php
PHP 腳本內使用相對路徑(require '../config.php')會因工作目錄為 C:\Windows\System32 而失效。**腳本內一律使用絕對路徑**或 __DIR__:
require __DIR__ . '/../config.php';
CLI 模式預設無時間限制(max_execution_time=0),但若透過 Web 觸發則受限。確保任務直接呼叫 CLI。
@echo off
D:\php\php.exe -q D:\www\timer.php >> D:\logs\timer.log 2>&1
將標準輸出與錯誤輸出導向日誌檔,便於事後排查。
| 維度 | .bat 方案 | .vbs 方案 |
|---|---|---|
| 視窗顯示 | 會彈出 CMD 視窗 | 完全隱藏 |
| 編寫難度 | 極低 | 低 |
| 除錯方便性 | 可見輸出 | 需看日誌 |
| 適用場景 | 測試、手動觸發、需看即時輸出 | 生產環境定時任務、無人值守 |
Windows 定時執行 PHP 核心步驟:**PHP 腳本用絕對路徑 → .bat/.vbs 包裝指定 php.exe 完整路徑 → 任務排程器設定最高權限與無論登入皆執行**。生產環境強烈建議使用 .vbs 方案 避免視窗干擾,並完善日誌導向機制。