PHP-CLI模式守护进程

  1. 参考链接

  2. 安装PHP扩展:pcntl

  3. PHP源码test.php

     <?php
     $pid = pcntl_fork();
     if ($pid < 0) {
         //Fork进程失败。
         echo "Fork进程失败。";
         exit(0);
     } elseif ($pid > 0) {
         //Fork进程成功。
         //echo "Fork进程成功。";
         exit(0);
     }
     //现在pid一定为0了,走子进程
     $sid = posix_setsid();
     if ($sid == -1) {
         //使当前进程成为会话的领导者
         echo "守护进程创建失败";
         exit(0);
     } else {
         //守护进程创建成功
         //echo "守护进程创建成功";
         while(true){
             sleep(100);
         }
         exit(0);
     }
     # 执行php test.php
     # 执行ps aux|grep test.php
     # 会发现虽然有sleep(100),但是程序立即挂起了
    
  4. 配合systemd实现异常退出时自动启动

    1. 进入system目录

       cd /etc/systemd/system
      
    2. 编写test.service

       vim test.service
      
       [Unit]
       Description=PHP测试脚本.
       After=default.target network.target
      
       [Service]
       User=www
       Group=www
       Type=forking
       ExecStart=/usr/bin/php /www/test.php
       PrivateTmp=true
       Restart=always
      
       [Install]
       WantedBy=multi-user.target
      
       ESC
       :wq
      
    3. 重载systemd并启动test服务设置开机启动

       # 重载systemd
       systemctl daemon-reload
       # 启动test服务
       systemctl start test
       # 设置开机启动
       systemctl enable test
      
  5. 优点

    1. 能够以守护进程方式运行脚本

    2. 能够在进程异常退出时自动重启

    3. 能够在服务器开机时自动启动进程

    4. 不会产生僵尸进程,僵尸进程查看方式

       ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
      
    5. 父进程立即结束,子进程会成为init进程的子进程(孤儿进程),可以正常管理

       # 原理
       因为父进程立即执行结束,所以子进程会成为孤儿进程被init进程(所有进程的祖先)收
       养(即不会成为僵尸进程),当子进程执行结束或异常退出时,能够正常释放进程号供其它
       进程使用。
      
@耿志环 2012-∞ 冀ICP备17033181号, powered by Gitbook修订: 2019-01-30 11:34:11

results matching ""

    No results matching ""