php 編寫linux守護程序
阿新 • • 發佈:2018-11-07
問題:將一個php程式以linux守護程序(在後臺執行)的方式執行?
解決方法:(見程式碼)
// index.php檔案
<?php /*實現守護程序化,當你的PHP程式需要轉為後臺執行時, 只需要呼叫一次封裝好的函式init()即可。 編寫守護程序的一般步驟步驟: (1)在父程序中執行fork並exit推出; (2)在子程序中呼叫setsid函式建立新的會話; (3)在子程序中呼叫chdir函式,讓根目錄 ”/” 成為子程序的工作目錄; (4)在子程序中執行fork並exit推出; (5)在子程序中呼叫umask函式,設定程序的umask為0; (6)在子程序中關閉任何不需要的檔案描述符*/ class Daemon{ public function init(){ //建立一個子程序 $pid = pcntl_fork(); if ($pid == -1){ throw new Exception('fork子程序失敗'); }elseif ($pid > 0){ //父程序退出,子程序變成孤兒程序被1號程序收養,程序脫離終端 exit(0) ; } //建立一個新的會話,脫離終端控制,更改子程序為組長程序$sid = posix_setsid(); if ($sid == -1) { throw new Exception('setsid fail'); } //修改當前程序的工作目錄,由於子程序會繼承父程序的工作目錄,修改工作目錄以釋放對父程序工作目錄的佔用。 chdir('/'); /** * 通過上一步,我們建立了一個新的會話組長,程序組長,且脫離了終端,但是會話組長可以申請重新開啟一個終端,為了避免 * 這種情況,我們再次建立一個子程序,並退出當前程序,這樣執行的程序就不再是會話組長。*/ $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子程序失敗'); } elseif ($pid > 0) { //再一次退出父程序,子程序的子程序(孫子程序)成為最終的守護程序 exit(0); } umask(0); //重設檔案建立掩模 //由於守護程序用不到標準輸入輸出,關閉標準輸入,輸出,錯誤輸出描述符 fclose(STDIN); fclose(STDOUT); fclose(STDERR); } } /* * 當前作業系統為linux時,啟動linux守護程序*/ if (strtoupper(substr(PHP_OS, 0, 3)) === 'Linux') { $daemon = new Daemon() ; $daemon -> init(); }
//這裡可以是你的程式程式碼,我將程式程式碼寫入了另一個檔案中了,故在此載入檔案 include_once __DIR__."/log_analysis.php" ;
?>
在linux系統中測試:
檢視index.php檔案是否在後臺執行: