程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Windows中使用計劃任務自動執行PHP程序實例

Windows中使用計劃任務自動執行PHP程序實例

編輯:PHP綜合

所謂任務計劃就是由計算機自動調用用戶事先設置好的應用程序,從而達到簡化用戶操作的目的。利用Windows 2000的任務計劃程序(相當與*NIX下的cron程序,這裡不再對其詳述),我們可以安排任何腳本、程序或文檔在最恰當的時候運行,從而滿足自己的需要。下面以Windows 2000為例。

具體來說,我們若需利用任務計劃程序自動運行則應執行如下步驟:

單擊"開始"按鈕,然後依次選擇"程序"→"附件"→"系統工具"→"任務計劃"(或者是"設置"→"控制面板"→"任務計劃"),啟動Windows 2000的任務計劃管理程序。
在"任務計劃"窗口中雙擊"添加任務計劃"圖標,啟動系統的"任務計劃向導",然後單擊"下一步"按鈕,在給出的程序列表中選擇需要自動運行的應用程序,然後單擊"下一步"按鈕。
設置適當的任務計劃名稱並選擇自動執行這個任務的時間頻率(如每天、每星期、每月、一次性、每次啟動計算機時、每次登錄時等),然後單擊"下一步"按鈕。
此時系統將會要求用戶對程序運行的具體時間進行設置,如幾號、幾點鐘、哪幾個時間段才能運行等,我們只需根據自己的需要加以設置即可。
接下來系統將會要求用戶設置適當的用戶名及密碼(如圖5所示),以便系統今後能自動加以運行。
最後,我們只需單擊"完成"按鈕即可將相應任務添加到Windows
2000的任務計劃程序中,此後它就會自動"記住"這個任務,一旦系統時間及相關條件與用戶設置的計劃相符,它就會自動調用用戶所指定的應用程序,十分方
便(每次啟動Windows 2000的時候,任務計劃程序都會自動啟動,並在後台運行,確保用戶的計劃能夠按時執行)。
現在我們來測試一下剛才所建的任務是否成功,鼠標右鍵單擊"php"程序圖標(如圖6所示),在彈出的菜單裡面選擇"運行"。一般情況下程序圖標只要這樣
激活運行就可以正常啟動。如果運行失敗可查看用戶和密碼是否設置正確,還有確定"Task
Scheduler"服務是否已啟動,本人當初就是為了節省系統資源把它關掉了導致運行失敗,害我找了大半天。另外也可從"系統日志"裡查看到底是什麼原
因造成運行失敗的。

好了,講了這麼多任務計劃的應用,現在我們切入正題,下面將介紹兩個例子:

一、讓PHP定時運行

編輯如下代碼,並保存為test.php:
復制代碼 代碼如下:

<?php
$fp = @fopen("test.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 讓PHP定時運行吧!\n");
fclose($fp);
?>

添加一個任務計劃,在(如圖2所示)這一步輸入命令:
復制代碼 代碼如下:

D:\php4\php.exe -q D:\php4\test.php

時間設置為每隔1分鐘運行一次,然後運行這個任務。
現在我們來看看d:\php4\test.txt文件的內容時候是否成功。如果內容為如下所示,那麼恭喜你成功了。

復制代碼 代碼如下:
2003-03-03 11:08:01 讓PHP定時運行吧!
2003-03-03 11:09:02 讓PHP定時運行吧!
2003-03-03 11:10:01 讓PHP定時運行吧!
2003-03-03 11:11:02 讓PHP定時運行吧!

二、讓MYSQL實現自動備份

編輯如下代碼,並保存為backup.php,如果要壓縮可以拷貝一個rar.exe:

復制代碼 代碼如下:
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-?'))) {
?>
backup Ver 0.01, for Win95/Win98/WinNT/Win2000/WinXP on i32
Copyright (C) 2000 ptker All rights reserved.
This is free software,and you are welcome to modify and redistribute it
under the GPL license

PHP Shell script for the backup MySQL database.

Usage: <?php echo $argv[0]; ?> <option>

<option> can be database name you would like to backup.
With the --help, or -? options, you can get this help and exit.
<?php
} else {
$dbname = $argv[1];
$dump_tool = "c:\\mysql\\bin\\mysqldump";
$rar_tool = "d:\\php4\\rar";
@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!";
}
?>

添加一個任務計劃,在(如圖2所示)這一步輸入命令:
復制代碼 代碼如下:

D:\php4\php.exe -q D:\php4\backup.php databasename

時間設置為每天運行一次,然後運行這個任務。
最後會在d:\php4\目錄下生成一個以數據庫名和當前時間組成的rar文件。
恭喜你!大功告成了!
當然備份方式有很多種,讀者可按照自己喜歡的去做!

以上是原著.結合本人實賤,補充說明如下:

如果出現錯誤:


在試著設置任務帳戶信息時出現錯誤
指定的錯誤是:
0x80070005:拒絕訪問
您沒有運行所請求的操作的權限

在上面'"4.接下來系統將會要求用戶設置適當的用戶名及密碼,以便系統今後能自動加以運行".這裡最好用"system"用戶,密碼可為空.
這個system的權限非常之高,比你的administrator還要高,所以你在運行命令的時候千萬不要亂來,這個可是什麼提示都沒有就會無條件執行的,這個權限下你kill核心進程都行.

上面2、添加一個任務計劃,在這一步輸入命令:

復制代碼 代碼如下:
D:\php4\php.exe -q D:\php4\test.php

正確形式應為
復制代碼 代碼如下:
"D:\php4\php.exe" -q "D:\php4\test.php"

即路徑要用雙引號括住.

 

最近做了幾個PHP的游戲項目,有棋牌游戲也有rpg游戲,其中都或多或少的需要一些定時更新信息的機制。比如棋牌游戲的玩家超時檢測。rpg游戲中用到的就更多了,怪物刷新、自動回血、任務過期、排行榜刷新等等。因為PHP沒有內存駐留程序,所以在處理上有一些困難。

我參考了一些同行的實現方法,通常的做法是根據具體項目的需要,用c++、python、java等寫一個輔助程序,定時對數據庫進行更新。但
是這樣做很麻煩。首先,這些輔助程序需要懂另外一門語言的程序員介入,勢必會增加一定開發成本和風險。第二,不同語言程序員之間聯調很麻煩,進度很慢,由
於輔助程序與前台之間的關系很緊密,基本上需要同時開發,一起調試。

我在項目中采用了一種定時執行任務的方法,自己感覺這個方案比較好,屬於一勞永逸型的,把所有代碼全都交給PHP這邊。

首先在數據庫中,定義一個名為task的表,裡面有兩個字段 exectime 和
url。其中exectime是一個unix類型的時間,url是字符串型的。每條數據都代表一個任務,具體意義是“這條任務在exectime時執行,
執行的地址為url”。輔助程序會每隔一秒鐘監視一次這個表,把當前時間對比表中每個任務的時間,如果時間達到,則請求該url,而後任務執行完成,刪除
這條任務。如此循環往復。

這樣做的好處是PHP程序開發人員可以很自由的在他們想要的時間執行他們想要執行的網頁。而且這個程序只需要寫一次,放到任何類似項目中都可以很好的使用。

我將這個程序做成了windows服務和archlinux的Daemon,這樣就實現了整個項目的跨平台。

補充內容:

任務的開啟是這樣的,我們做了一個類似大型網游的服務器開關界面,登錄游戲後台後,到服務器控制頁面,可以查看當前服務器的運行狀態,可以開啟或者關閉服務器。開啟服務器則是把相關任務插入到任務列表中,關閉服務器是把任務列表清空。是人工形式的。


任務的重復開啟,因為這些任務都是由php插入到任務表中去的,而且任務表中的每條任務都是執行一次就由輔助程序刪除的,所以每個任務只能執行一次。如果有任務需要循環執行,那麼就只能是通過在執行這個任務(即任務的url)的php代碼裡面,再把他自己重新插入到任務列表中去。


任務的超時,任務超時分為兩種,數據表中,任務的執行之間超時,一種是請求該任務頁面超時。第一種情況不會發生,因為輔助程序每次都執行小於等於當前 時間的所有任務。第二種情況,輔助程序會自動判斷這個頁面的訪問是否成功,如果返回服務器錯誤或無法連接等,就保留此任務,不刪除,等到下次循環時再嘗試 執行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved