PHP本身沒有定時自動執行的功能,也不支援多線程。但是結合Task Scheduler和cURL,就可以彌補PHP的上述兩個缺陷,同時還可以脫離Apache伺服器環境,在任意路徑下運行PHP指令碼。 知識準備
cURL的學習與應用:
http://www.cnblogs.com/phphuaibei/archive/2011/09/29/2195838.html
Windows 7中使用Task Scheduler:
http://www.cnblogs.com/tylerdonet/archive/2011/05/25/2057227.html 中的“添加Windows任務”部分
How to use Windows Task Scheduler:
http://www.iopus.com/guides/winscheduler.htm 調用cURL多程式抓取網頁的PHP指令碼
batch.php
<?php$urls = array( 'http://www.baidu.com', 'http://www.csdn.net', 'http://www.google.com.hk'); // 初始化多線程$mh = curl_multi_init(); // 向多線程中添加每個單獨的cURL$conn = array();foreach ($urls as $key => $url) { $conn[$key]= curl_init($url); curl_setopt($conn[$key],CURLOPT_HEADER, 0); curl_setopt($conn[$key],CURLOPT_RETURNTRANSFER, 0); curl_multi_add_handle($mh,$conn[$key]);} // 執行cURL多線程do { $mrc= curl_multi_exec($mh, $active);}while ($mrc == CURLM_CALL_MULTI_PERFORM);while ($active && $mrc == CURLM_OK){ if(curl_multi_select($mh) != -1) { do{ $mrc= curl_multi_exec($mh, $active); } while($mrc == CURLM_CALL_MULTI_PERFORM); }} // 釋放多線程中的每個cURL線程foreach ($urls as $key => $url) { curl_error($conn[$key]); curl_multi_remove_handle($mh,$conn[$key]); curl_close($conn[$key]);} // 關閉多線程curl_multi_close($mh);?>
需要說明的是,cURL在PHP中的多執行緒其實並不是真正的多線程,而是用單線程批處理類比的多線程效果。 設定環境變數
為了方便調用php.exe,需要在環境變數的系統變數Path中添加php.exe所在目錄的路徑,如下圖所示:
設定Windows Task Scheduler
Windows 7環境下,啟動Task Scheduler(工作排程器)的方式有兩種,分別是:
1. 控制台→管理工具→工作排程器;
2. 開始→運行→輸入“工作排程器”或者“scheduled task”,斷行符號。
設定計劃任務來自動調用PHP指令碼的步驟如下:
1. 點擊“建立基本任務”,進入導航
2. 第一步,輸入計劃任務的名稱和描述
3. 設定任務開始的時間
4. 設定任務執行的具體操作
前述調用cURL的PHP指令碼放在E盤根目錄下,脫離了Apache伺服器環境。
此處填寫的程式(或指令碼)和參數需要再命令列下測試通過方才有效。
5. 完成後開啟屬性對話方塊,在“觸發器”中點擊“編輯”,設定自動重複執行的間隔
以上就是設定工作排程器的過程,之後每隔5分鐘會彈出一個php.exe的DOS視窗,則設定成功。