在php中使用守護進程

linux服務器上能夠使用php xxx.php &後臺執行,可是由於啓動的進程屬於當前登陸終端的進程組,因此當終端關閉是進程會退出。使用nohup php xxx.php>/dev/null 2>&1 &能夠脫離終端掛起腳本,另一種方法能夠在代碼裏fork子進程,使子進程脫離終端進程組獨立運行。php

代碼示例。linux

  1. <?php  
  2.   
  3. $pid = pcntl_fork();  
  4.   
  5. if ($pid == -1)  
  6. {  
  7.     throw new Exception('fork子進程失敗');  
  8. }  
  9. elseif ($pid > 0)  
  10. {  
  11.     //父進程退出,子進程變成孤兒進程被1號進程收養,進程脫離終端  
  12.     exit(0);  
  13. }  
  14.   
  15. // 最重要的一步,讓該進程脫離以前的會話,終端,進程組的控制  
  16. posix_setsid();  
  17.   
  18. // 修改當前進程的工做目錄,因爲子進程會繼承父進程的工做目錄,修改工做目錄以釋放對父進程工做目錄的佔用。  
  19. chdir('/');  
  20.   
  21. /* 
  22.  * 經過上一步,咱們建立了一個新的會話組長,進程組長,且脫離了終端,可是會話組長能夠申請從新打開一個終端,爲了不 
  23.  * 這種狀況,咱們再次建立一個子進程,並退出當前進程,這樣運行的進程就再也不是會話組長。 
  24.  */  
  25. $pid = pcntl_fork();  
  26. if ($pid == -1)  
  27. {  
  28.     throw new Exception('fork子進程失敗');  
  29. }  
  30. elseif ($pid > 0)  
  31. {  
  32.     //  再一次退出父進程,子進程成爲最終的守護進程  
  33.     exit(0);  
  34. }  
  35.   
  36. // 因爲守護進程用不到標準輸入輸出,關閉標準輸入,輸出,錯誤輸出描述符  
  37. fclose(STDIN);  
  38. fclose(STDOUT);  
  39. fclose(STDERR);  
  40.   
  41. /* 
  42.  * 處理業務代碼 
  43.  */  
  44.   
  45. while(TRUE)  
  46. {  
  47.     file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);  
  48.     sleep(5);  
  49. }  
相關文章
相關標籤/搜索