php虛擬機器主機下實現定時任務(僅供參考)

來源:互聯網
上載者:User

標籤:charset   blog   開啟   檔案結構   啟動   images   儲存   開始   alt   

因為要做簡單的中控  在實現心跳包的時候遇到了困難 正常的心跳包思路是這樣的  舉個例子 我寫一個登陸簽到指令碼   當我登陸成功的時候 會把登陸成功這個狀態傳遞給網路上的中控端 當我簽到完成的時候會把簽到成功的指令碼狀態傳遞給網路上的中控端 這樣 我們在中控那邊就可以清晰的看到當前指令碼運行到哪個部分 如果指令碼停止 以安卓按鍵為準會觸發一個  OnScriptExit 事件  我們只需要在這個事件裡面寫上代碼  當觸發這個事件的時候 我們就給中控端發送下指令碼狀態為close 或者stop的狀態資訊 中控端就可以清楚指令碼當前具體是處於什麼狀態 但是這個只是理想化狀態   因為 有的時候指令碼未必是正常關閉的 這樣會導致 在中控端 因為遲遲收不到指令碼的最新訊息  當前指令碼狀態無法變化  看起來還在運行 但是實際上已經指令碼崩潰導致問題,後來想到了心跳包  就是多開1個線程 間隔一會就向中控端發送資訊 來讓中控端知道 我這個指令碼還在運行 如果超出一定時間內 中控端再也沒接收到這個指令碼的心跳包 那麼中控端就會判定該指令碼已經關閉

要解決的問題:從實際上來說 我們中控端有一個額外的操作 就是 間隔一定的時間 就搜尋下資料庫裡面 所有的指令碼記錄 看看每個記錄的最新記錄時間和目前時間 相差多少 如果相差太多 就直接讓這個記錄對應的指令碼狀態設定了close或者stop  保證應對指令碼異常關閉的情況 這也是這個文章的主要要解決的問題


思路:因為是虛擬機器主機 不是真正的主機 如果是真正的主機 那麼可以考慮的辦法相當的多 也無需像我這樣費盡心機 比如可以用主機系統的計劃任務來定時執行某些資料庫操作 也可以用mysql的超級管理員的一些功能來實現定時任務  。百度了下 獲得了一些基本思路 這些思路無非就是使用 ignore_user_abort(); //函數設定與客戶機斷開是否會終止指令碼  set_time_limit(0); 實現一個無限死迴圈  在這個死迴圈裡面 我們可以通過sleep進行適當的延遲間隔 來進行一定的操作  但是當我實際的來寫代碼的時候發現一些原來沒有考慮過的問題

產生的新問題:

1.我們訪問一次這個特殊頁面就開啟一個無限死迴圈(定時任務)  如果開啟多個 那麼對整個伺服器的資源消耗是巨大的 非常影響網站的正常訪問 所以我們必須要採取措施讓這個無限死迴圈(定時任務)只能存在1個

2 我們需要有一個開關來控制這個無限迴圈  開啟無限迴圈(定時任務)我們可以訪問特殊頁面開啟 但是 關閉這個無限迴圈(定時任務) 我們也需要1個開關來控制 ----->用一個txt的內容來控制關閉

3.我們訪問這個特殊頁面後就開啟了無限死迴圈(定時任務) 我們可以關閉這個特殊頁面 但是這個無限死迴圈會一直執行下去 我們不清楚這個無限死迴圈(定時任務)都在幹什麼  都在忙什麼  就算無限死迴圈(定時任務)出了問題 我們也不清楚 –-->專門做了一個簡單的定時任務日誌來監控 這個無限迴圈(定時任務)的運行情況

網頁檔案結構

browse_log.php 是記錄檔 專門用來記錄當天的定時任務的運行反饋

timed_task.php 是主檔案 只要訪問這個網頁 就可以開啟一個無限死迴圈(定時任務)

timed_task_18-08-22.log這個其實是真正的記錄檔  browse_log.php是讀取它的內容到網頁上顯示而已 但是 每一天都對應一個獨立的log檔案 log檔案名稱字會變化 所以索性就顯示到網頁上

timed_task_config.txt 是無限迴圈(定時任務) 的設定檔  主要是用來關閉所有的無限迴圈(定時任務)和避免開啟多個無限迴圈(定時任務)


用法:

開啟無限迴圈(定時任務) :確保timed_task_config.txt 存在 並且內容為空白  訪問timed_task.php 等待頁面反饋 如果頁面進入卡住狀態 則直接查看browse_log.php   看看日誌裡面是否記錄啟動成功

關閉無限迴圈(定時任務) :將timed_task_config.txt的內容改為close 然後等待一會 查看browse_log.php   看看日誌裡面是否記錄關閉 記錄了關閉才算關閉成功

日誌查看:查看browse_log.php  有一點很關鍵注意看上下2個正常日誌的時間間隔是否是符合你的要求 如果出現一些誤差比較大的時間差 那麼可以考慮是不是多開了無限迴圈  可以全部關閉重開下


主檔案timed_task,php的代碼

<?phpignore_user_abort(); //函數設定與客戶機斷開是否會終止指令碼的執行set_time_limit(0); // 來設定一個指令碼的執行時間為無限長date_default_timezone_set(‘PRC‘); // 切換到中國的時間$interval=20;//間隔多久執行一次$timed_task_config_path="timed_task_config.txt";//負責讓這個無限迴圈停止的一個開關 其實是控制定時任務機制的一個設定檔 如果該檔案不存在或者 裡面的內容為close 那麼定時任務不會執行  如果為open 則會開啟一個無限迴圈來進行監控和執行定時任務?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>定時任務</title></head><body><?php//問題1 如何控制這些無限迴圈讓他們停止//問題2 如何避免開啟多個無限迴圈增加伺服器的資源消耗//問題3 無限迴圈的日誌監控和避免無限增加的處理辦法//控制用txt//php定時計劃任務//檢測定時任務的設定檔 是否存在或者裡面的內容  //strpos($str1,"open")if(file_exists($timed_task_config_path)){    //存在設定檔 開始檢測裡面的內容    $str1="";    $str1=trim(file_get_contents($timed_task_config_path));    if (is_numeric(strpos($str1,"open"))) {    ////1.內容為open 表示當前已經有定時任務線程在運行了 就不再額外執行定時任務        send_timed_task_log("已經有一個定時任務進程存在 不能開啟其他的進程");            exit("已經有一個定時任務進程存在 不能開啟其他的進程");    } elseif (is_numeric(strpos($str1,"close"))) {    ////2.內容為close表示要求定時任務關閉 更不用        send_timed_task_log("設定檔要求關閉所有定時任務進程");        exit("設定檔要求關閉所有定時任務進程");    } else {    ////3.如果不是open 和close 那麼就鎖定該檔案然後修改裡面的內容為open 修改成功        $fp = fopen($timed_task_config_path, ‘w+‘);        if(!is_writable($timed_task_config_path)){            send_timed_task_log("無法寫入設定檔 請重新整理重試");          exit("<p>無法寫入設定檔 請重新整理重試</p>");        }        flock($fp, LOCK_EX);        fwrite($fp, ‘open‘);        sleep(1);        flock($fp, LOCK_UN);        fclose($fp);                //////////如果再次讀取下設定檔內容判斷是否寫入成功 成功則開始執行後面的無限迴圈  不成功提示並結束網頁        $str1="";        $str1=trim(file_get_contents($timed_task_config_path));//        echo "<p>".$str1." </p>";//        echo "<p>".strpos($str1,"open")." </p>";//        exit();        if (is_numeric(strpos($str1,"open"))) {            ///////////////修改成功 擷取到了定時任務進程的權利            send_timed_task_log("啟動成功 請關閉網頁");                        do{            $body="";            if (file_exists($timed_task_config_path)) {            $body = trim(file_get_contents($timed_task_config_path));                if (is_numeric(strpos($body,"close")))                {                send_timed_task_log("設定檔要求關閉所有的定時任務");                exit("<p>設定檔要求關閉所有的定時任務</p>");                }            } else {                send_timed_task_log("沒有找到定時任務設定檔");                exit("<p>沒有找到定時任務設定檔 進程結束</p>");            }                        //-----------------------定時操作開頭-------------------------------                        send_timed_task_log("<常規檢測:一切正常>");                        //-----------------------定時操作結尾-------------------------------            sleep(rand($interval-2,$interval+2)); // 函數延遲代碼執行若干秒 為了避免完全一樣 隨機下間隔避免一些問題                        }while(true);                                }else{            send_timed_task_log("沒有擷取到定時任務進程的許可權 請重新整理重試");            exit("沒有擷取到定時任務進程的許可權 請重新整理重試");        }    }}else{         send_timed_task_log("定時任務設定檔不存在 不執行該");    exit("<p>定時任務設定檔不存在 不執行該任務</p>");}//用來發送定時任務日誌的函數function send_timed_task_log($str) {        //接收從指令碼傳遞來的日誌資訊 判斷當前的日期 把這個日誌資訊儲存到當前日期命名的記錄檔裡    if (trim($str)<>""){    $nowtimefilepath="timed_task_".date("y-m-d",time()).".log";    $send_str=date("y-m-d",time());    $send_str=date("Y-m-d H:i:s",time())."----".trim($str)."\r\n";    file_put_contents($nowtimefilepath,$send_str,FILE_APPEND);//????? ???????    }else{            }  }?></body></html>

完整:

https://pan.baidu.com/s/1__xp1oSVdT2aDXj5BjxYHw

php虛擬機器主機下實現定時任務(僅供參考)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.