在 Windows 環境部署 PHP 應用時,定時任務是常見需求:定時發送郵件、清理臨時文件、資料庫自動備份等。本文詳細介紹兩種主流方案:Windows 任務計劃器 + PHP CLI 以及 PHP 內建排程邏輯,並附贈 MySQL 自動備份腳本實戰與常見坑位避雷指南。
建立 test.php,採用 CLI 模式執行,避免 Web 超時限制:
<?php
$fp = @fopen("test.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 定時任務執行成功!\n");
fclose($fp);
?>
新建 run_task.bat,指定 PHP 執行檔與腳本路徑:
D:\php\php.exe -q D:\php\test.php
關鍵參數說明:
-q:靜默模式,抑制 HTTP 標頭輸出D:\php\run_task.batSYSTEM(最高權限,無需密碼)查看 test.txt 應輸出類似:
2024-01-15 10:00:01 定時任務執行成功!
2024-01-15 10:01:02 定時任務執行成功!
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-?'))) {
// 顯示幫助信息
exit;
}
$dbname = $argv[1];
$dump_tool = "C:\mysql\bin\mysqldump.exe";
$rar_tool = "D:\php\rar.exe";
// 執行備份並壓縮
@exec("$dump_tool --opt -u user -ppassword $dbname > ./$dbname.sql");
@exec("$rar_tool a -ag_yyyy_mm_dd_hh_mm $dbname.rar $dbname.sql");
@unlink("$dbname.sql");
echo "Backup complete!";
?>
D:\php\php.exe -q D:\php\backup.php my_database
設置為每天凌晨 2 點執行,備份文件將以 my_database_2024_01_15_02_00.rar 格式命名。
原因:任務計劃器帳戶權限不足。
解決:使用 SYSTEM 帳戶執行,該帳戶擁有最高權限,無需密碼。
警告:SYSTEM 權限極高,執行命令時務必謹慎,避免誤刪系統文件。
在備份腳本開頭添加:
ini_set('max_execution_time', 0); // 0 表示無限制
set_time_limit(0);
批處理文件中路徑請用雙引號包裹:
"D:\Program Files\PHP\php.exe" -q "D:\My Scripts\backup.php"
cronw、nssm 將 PHP 腳本註冊為服務spatie/laravel-schedule(需 Laravel 框架)Windows 下 PHP 定時任務的核心公式是:PHP CLI + 批處理文件 + 任務計劃器(SYSTEM帳戶)。掌握這套組合拳,配合 mysqldump 與壓縮工具,即可構建穩健的自動化運維體系。生產環境建議增加日誌記錄、失敗告警(郵件/企業微信)與備份文件定期上傳至雲存儲。