本篇文章介紹的內容是Linux環境下PHP後台守護進程的實現方式,現在分享給大家,有需要的朋友可以看一下
應用情境
某些情況下,我們需要持續的周期性的提供一些服務,比如監控記憶體或cpu的健全狀態,這些應用與用戶端是沒有關係的,不是說用戶端(如web介面,手機app等)關閉了,我們就不監控記憶體或cpu了,為了應對這種業務情境,後台守護進程就可以派上用場了。
所需環境
Linux
實現方式
1. 準備php指令碼
在/usr/local/src/目錄下,建立一個daemon.php指令檔,內如如下:
[php] view plain copy
<?php Class Daemon{ /** * 初始化一個守護進程 * @throws Exception */ 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); } //由於守護進程用不到標準輸入輸出,關閉標準輸入,輸出,錯誤輸出描述符 fclose(STDIN); fclose(STDOUT); fclose(STDERR); } } $daemon = new Daemon(); $daemon->init(); //處理業務代碼 while(true) { file_put_contents('/usr/local/src/log.txt', time().PHP_EOL, FILE_APPEND); sleep(5); }
該指令碼的作用,就是每隔5秒,向記錄檔中寫入一個時間戳記,當然,這個只是一個簡單的樣本,具體應用中,我們還需要根據業務的不同,編寫具體的業務處理代碼。
2. 以後台方式運行php指令碼
在命令列下,輸入:
[plain] view plain copy
nohup php /usr/local/src/daemon.php &
3. 查看日誌輸出
在命令列下,輸入:
[plain] view plain copy
tail -f /usr/local/src/log.txt
我們將會看到如下資訊:
4. 關閉php後台進程
首先,我們需要查出該進程的PID,命令:
[plain] view plain copy
ps -ef | grep "php /usr/local/src/daemon.php"
然後,通過這個PID把該進程kill掉
[plain] view plain copy
kill -9 22767
其中,22767就是php後台進程的PID號。
5. 開機自啟
通過前面的步驟,我們知道如何開啟和關閉一個php進程,但是,在實際的應用中,我們不可能每次都是手動開啟,這樣我們就會損失掉一部分業務資料,所以我們必須要讓該進程開機自動運行,步驟如下:
在/etc/rc.local檔案中,將nohup php /usr/local/src/daemon.php &這個命令加入即可。
相關推薦:
php後台守護進程+進程訊號處理