php定時計劃常用實現方法

來源:互聯網
上載者:User

我需要一個辦法,可以每天定時執行網站上的php指令碼。php本身並沒有提供這樣的函數,於是我在網上找到3種“php計劃任務的實現方案”。

第一種
利用作業系統的一些命令,如linux的“crond” 實現。這種方法最簡單可行,但是需要你有足夠的許可權。我的網站是租用的虛擬空間,所以pass。

第二種
寫一個php程式,獲得目前時間,然後用目前時間與設定時間對比,如果目前時間比設定時間大,就會執行一些指令碼。將php程式放入每一個網頁中,這樣只要有使用者訪問網站,就會執行這個php程式,變相的實現計劃任務。
我們考慮一個極端情況:如果這個網站萬年沒人訪問(或者網站本來就是有特殊目的的,比如me),計劃任務不久掛了嗎?pass

第三種
初次看這個方案,一股非主流的氣息撲面而來。
php有一個ignore_user_abort()函數,可以保證網頁斷開,php指令碼繼續執行。配合set_time_limit(0),可以讓指令碼無時間限制執行。於是有以下代碼:

ignore_user_abort(); //即使Client斷開(如關掉瀏覽器),PHP指令碼也可以繼續執行. set_time_limit(0); // 執行時間為無限制,php預設的執行時間是30秒,通過set_time_limit(0)可以讓程式無限制的執行下去 $interval=5; // 每隔5秒運行 do{ //你的事務放這裡 //你的事務放這裡 //你的事務放這裡 sleep($interval); // 等待5秒 }while(true);//死迴圈保證程式永遠執行 

我將以上代碼放入網站裡面運行,不久我就後悔了。因為指令碼根本無法手動停止,即使你將php檔案刪除。我只能將apache重啟。後來我修改了這個代碼:

<?php ignore_user_abort(); //即使Client斷開(如關掉瀏覽器),PHP指令碼也可以繼續執行. set_time_limit(0); // 執行時間為無限制,php預設的執行時間是30秒,通過set_time_limit(0)可以讓程式無限制的執行下去 $interval=5; // 每隔5秒運行 do{ //你的事務放這裡 //你的事務放這裡 //你的事務放這裡 sleep($interval); // 等待5秒 exeStop();//若符合條件,停止 }while(true);//死迴圈保證程式永遠執行 //這個函數檢查目錄中有沒有"exeStop"這個檔案。如果有,則停止程式。 //也就是說,如果你想要停止程式。只要在目錄下建一個檔案"exeStop"。 function exeStop() { $fileName="exeStop"; if(file_exists($fileName)) { //根據網上資料,以下5行任何一行都能kill掉這個進程。 //但是我被這個程式嚇怕了,多帶點符防鬼。 ignore_user_abort(false); set_time_limit(10); ob_end_flush(); echo "STOP"; exit(); } } ?> 

 

ok,如果以上的實驗成功,就不會有今天的文章了。我用這個代碼每隔幾秒做一件事情,一點事都沒有。但是我讓它每天自動發送一封郵件,這位快遞只幹了一次活,第二天就抄了我的魷魚。可能是虛擬空間有某種程式,會kill掉長期存在的進程,或者伺服器會在我們睡覺的時候重啟。總之,這個方案失敗(非主流果然不可靠)。pass

據說mysql有計劃執行任務的功能,我不太瞭解。我想到了另外一個更加非主流的方法。
假設我的筆記本永遠開機,我就能讓它在固定時間串連網站上的php程式,實現計劃任務。我的筆記本當然不可能永遠開機,但是我可以讓My Phone完成這個事情。My Phone是android系統,我尋找了一些資料。我可以讓android手機定時開啟gprs,串連網站上的php檔案,關閉gprs。ok,計劃任務成功。

此方案待實驗。

 

=================================================================

使用php讓瀏覽器重新整理需要解決幾個問題
  1. PHP指令碼執行時間限制,預設的是30m 解決辦法:set_time_limit();或者修改PHP.ini 設定max_execution_time時間(不推薦)
  2. 如果用戶端瀏覽器關閉,程式可能就被迫終止,解決辦法:ignore_user_abort即使關閉頁面依然正常執行
  3. 如果程式一直執行很有可能會消耗大量的資源,解決辦法使用sleep使用程式休眠一會,然後在執行

PHP定時執行的代碼:

<?phpignore_user_abort();//關掉瀏覽器,PHP指令碼也可以繼續執行.set_time_limit(3000);// 通過set_time_limit(0)可以讓程式無限制的執行下去$interval=5;// 每隔5s運行//方法1--死迴圈do{echo '測試'.time().'<br/>';sleep($interval);// 等待5s}while(true);//方法2---sleep 定時執行require_once './curlClass.php';//引入檔案$curl = new httpCurl();//執行個體化$stime = $curl->getmicrotime();for($i=0;$i<=10;$i++){echo '測試'.time().'<br/>';sleep($interval);// 等待5s}ob_flush();flush();$etime = $curl->getmicrotime();echo '<hr>';echo round(($etime-stime),4);//程式執行時間?>

測試的時候發現這個效率並不是很高

總結:

個人感覺PHP定時執行任務的效率不是很高,建議關於定時執行任務的工作還是交給shell來做吧,比較那才是王道。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.