Linux環境下PHP後台守護進程的實現方式

來源:互聯網
上載者:User
本篇文章介紹的內容是Linux環境下PHP後台守護進程的實現方式,現在分享給大家,有需要的朋友可以看一下

應用情境

某些情況下,我們需要持續的周期性的提供一些服務,比如監控記憶體或cpu的健全狀態,這些應用與用戶端是沒有關係的,不是說用戶端(如web介面,手機app等)關閉了,我們就不監控記憶體或cpu了,為了應對這種業務情境,後台守護進程就可以派上用場了。

所需環境

Linux

實現方式

1. 準備php指令碼

在/usr/local/src/目錄下,建立一個daemon.php指令檔,內如如下:


[php] view plain copy


  1. <?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

  1. nohup php /usr/local/src/daemon.php &

3. 查看日誌輸出

在命令列下,輸入:

[plain] view plain copy

  1. tail -f /usr/local/src/log.txt

我們將會看到如下資訊:

4. 關閉php後台進程

首先,我們需要查出該進程的PID,命令:

[plain] view plain copy

  1. ps -ef | grep "php /usr/local/src/daemon.php"

然後,通過這個PID把該進程kill掉

[plain] view plain copy

  1. kill -9 22767

其中,22767就是php後台進程的PID號。

5. 開機自啟

通過前面的步驟,我們知道如何開啟和關閉一個php進程,但是,在實際的應用中,我們不可能每次都是手動開啟,這樣我們就會損失掉一部分業務資料,所以我們必須要讓該進程開機自動運行,步驟如下:

在/etc/rc.local檔案中,將nohup php /usr/local/src/daemon.php &這個命令加入即可。

相關推薦:

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.