在 Windows Server (IIS) 環境中讓 PHP 腳本定時自動執行,核心思路是:系統任務計劃程式 → 批次檔 → php.exe 執行腳本。本文提供圖文級步驟、批次檔範本、常見坑位與替代方案。
新建 run_php_task.bat,內容如下:
@echo off
REM 切換至 PHP 安裝目錄(根據實際路徑修改)
D:
cd D:\php
REM 執行目標 PHP 腳本(使用絕對路徑)
php.exe D:\wwwroot\cron\scan_task.php >> D:\logs\cron_scan.log 2>&1
REM 可選:記錄執行時間
echo [%date% %time%] Task executed >> D:\logs\cron_scan.log
關鍵點:
php.exe 而非 php-cgi.exe(CLI 模式無超時限制、無 HTTP 標頭干擾)。>> 追加日誌,2>&1 將 stderr 合併到 stdout,便於排錯。PHP_Cron_Scan,描述:每小時掃描一次。D:\php\run_php_task.bat(或直接指向 php.exe 並帶參數)。<?php
// D:\wwwroot\cron\scan_task.php 測試腳本
file_put_contents("D:/logs/test_cron.txt", "Cron run at " . date("Y-m-d H:i:s") . PHP_EOL, FILE_APPEND);
?>
手動雙擊 .bat 或在任務計劃中右鍵「執行」,檢查日誌檔案是否生成、內容正確。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Windows 任務計劃 + 批次檔 | 原生、無額外依賴、權限可控 | 最小粒度 1 分鐘、跨機器管理麻煩 | 單機、低頻、簡單任務 |
| Linux Cron + SSH 遠程調用 | 功能豐富、集中管理 | 需額外 Linux 主機 | 混合環境、高頻任務 |
| PHP 內建 Swoole/Workerman 定時器 | 毫秒級、常駐記憶體、程式碼控制 | 需常駐進程、學習成本高 | 高併發、實時性要求高 |
| 第三方排程平台 | 視覺化、分散式、重試告警 | 部署複雜 | 微服務、企業級應用 |
php.exe script.php 但未指定工作目錄 → 相對路徑失效。php-cgi.exe → 超時 30 秒被殺、輸出 HTTP 標頭污染日誌。$_SERVER、$_GET 等 Web 變量 → CLI 模式下不存在。chdir(dirname(__FILE__)) 固定工作目錄。ini_set('max_execution_time', 0) 移除執行時間限制。