首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Windows 任務排程器執行 PHP 腳本完整教學:.bat 與 .vbs 兩種方案對比

     編輯:PHP 相關知識

場景需求

在 Windows 伺服器定時執行 PHP 腳本(如資料備份、報表生成、快取清理),不依賴 Linux crontab。

方案一:批次檔(.bat)+ 任務排程器

1. 編寫 PHP 腳本

<?php
// timer.php
$fp = fopen('timer.log', 'a+');
fwrite($fp, date('Y-m-d H:i:s') . " 任務執行成功!\n");
fclose($fp);
// 可放心使用 include、require、資料庫操作等
?>

2. 建立 .bat 包裝腳本

@echo off
D:\php\php.exe -q D:\www\timer.php
REM 路徑請改為實際 PHP 執行檔與腳本絕對路徑
  • -q:抑制 HTTP 標頭輸出(CLI 模式預設不輸出,加上更保險)。
  • 使用**絕對路徑**避免工作目錄問題。

3. 設定任務排程器

  1. 控制台 → 系統與安全性 → 管理工具 → 工作排程器
  2. 建立基本任務 → 觸發條件(每日/每週/每月/自訂)
  3. 動作:啟動程式 → 程式/腳本:選擇 timer.bat
  4. 完成 → 右鍵任務 → 內容 → 勾選「無論使用者是否登入都要執行」+「使用最高權限執行」
  5. 輸入 Windows 登入密碼確認

4. 測試

右鍵任務 → 「執行」 → 檢查 timer.log 是否寫入成功。

方案二:VBScript(.vbs)隱藏黑色視窗

.bat 執行時會彈出 CMD 黑框,影響使用者體驗或被誤關閉。.vbs 可完全隱藏視窗。

建立 timer.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

任務排程器動作指向 timer.vbs

其餘步驟同 .bat 方案。執行時無任何視窗彈出,背景靜默完成。

進階技巧與避坑指南

1. 解決「找不到 php.ini」問題

CLI 模式預設讀取 php.exe 同目錄下的 php.ini。若報錯缺少擴展,可在 .bat 中指定:

D:\php\php.exe -c D:\php\php.ini -q D:\www\timer.php

2. 相對路徑失效問題

PHP 腳本內使用相對路徑(require '../config.php')會因工作目錄為 C:\Windows\System32 而失效。**腳本內一律使用絕對路徑**或 __DIR__:

require __DIR__ . '/../config.php';

3. 長時間執行超時

CLI 模式預設無時間限制(max_execution_time=0),但若透過 Web 觸發則受限。確保任務直接呼叫 CLI。

4. 日誌與錯誤捕獲

@echo off
D:\php\php.exe -q D:\www\timer.php >> D:\logs\timer.log 2>&1

將標準輸出與錯誤輸出導向日誌檔,便於事後排查。

5. 權限問題

  • 任務設定「使用最高權限執行」
  • PHP 腳本寫入目錄需給執行帳號寫入權限
  • 網路資源(共享資料夾、遠端 DB)需帳號具備網路存取權

方案對比總結

維度.bat 方案.vbs 方案
視窗顯示會彈出 CMD 視窗完全隱藏
編寫難度極低低
除錯方便性可見輸出需看日誌
適用場景測試、手動觸發、需看即時輸出生產環境定時任務、無人值守

總結

Windows 定時執行 PHP 核心步驟:**PHP 腳本用絕對路徑 → .bat/.vbs 包裝指定 php.exe 完整路徑 → 任務排程器設定最高權限與無論登入皆執行**。生產環境強烈建議使用 .vbs 方案 避免視窗干擾,並完善日誌導向機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved