在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. }  
相关文章
相关标签/搜索