所謂任務計劃就是由電腦自動調用使用者事先設定好的應用程式,從而達到簡化使用者操作的目的。利用Windows 2000的工作排程器(相當與*NIX下的cron程式,這裡不再對其詳述),我們可以安排任何指令碼、程式或文檔在最恰當的時候運行,從而滿足自己的需要。下面以Windows 2000為例。
具體來說,我們若需利用工作排程器自動運行則應執行如下步驟:
單擊"開始"按鈕,然後依次選擇"程式"→"附件"→"系統工具"→"任務計劃"(或者是"設定"→"控制台"→"任務計劃"),啟動Windows 2000的任務計劃管理程式。
在"任務計劃"視窗中雙擊"新增工作計劃"表徵圖,啟動系統的"任務計劃嚮導",然後單擊"下一步"按鈕,在給出的程式列表中選擇需要自動啟動並執行應用程式,然後單擊"下一步"按鈕。
設定適當的任務計劃名稱並選擇自動執行這個任務的時間頻率(如每天、每星期、每月、一次性、每次啟動電腦時、每次登入時等),然後單擊"下一步"按鈕。
此時系統將會要求使用者對程式啟動並執行具體時間進行設定,如幾號、幾點鐘、哪幾個時間段才能運行等,我們只需根據自己的需要加以設定即可。
接下來系統將會要求使用者佈建適當的使用者名稱及密碼(5所示),以便系統今後能自動加以運行。
最後,我們只需單擊"完成"按鈕即可將相應任務添加到Windows
2000的工作排程器中,此後它就會自動"記住"這個任務,一旦系統時間及相關條件與使用者佈建的計劃相符,它就會自動調用使用者所指定的應用程式,十分方
便(每次啟動Windows 2000的時候,工作排程器都會自動啟動,並在後台運行,確保使用者的計劃能夠按時執行)。
現在我們來測試一下剛才所建的任務是否成功,滑鼠右鍵單擊"php"程式表徵圖(6所示),在彈出的菜單裡面選擇"運行"。一般情況下程式表徵圖只要這樣
啟用運行就可以正常啟動。如果運行失敗可查看使用者和密碼是否設定正確,還有確定"Task
Scheduler"服務是否已啟動,本人當初就是為了節省系統資源把它關掉了導致運行失敗,害我找了大半天。另外也可從"系統日誌"裡查看到底是什麼原
因造成運行失敗的。
好了,講了這麼多任務計劃的應用,現在我們切入正題,下面將介紹兩個例子:
一、讓PHP定時運行
編輯如下代碼,並儲存為test.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:
複製代碼 代碼如下:
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:
can be database name you would like to backup.
With the --help, or -? options, you can get this help and exit.
} 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代碼裡面,再把他自己重新插入到工作清單中去。
任務的逾時,任務逾時分為兩種,資料表中,任務的執行之間逾時,一種是請求該任務頁面逾時。第一種情況不會發生,因為輔助程式每次都執行小於等於當前 時間的所有任務。第二種情況,輔助程式會自動判斷這個頁面的訪問是否成功,如果返回伺服器錯誤或無法串連等,就保留此任務,不刪除,等到下次迴圈時再嘗試 執行。