linux服务器上能够使用php xxx.php &后台执行,可是由于启动的进程属于当前登陆终端的进程组,因此当终端关闭是进程会退出。使用nohup php xxx.php>/dev/null 2>&1 &能够脱离终端挂起脚本,另一种方法能够在代码里fork子进程,使子进程脱离终端进程组独立运行。php
代码示例。linux
- <?php
-
- $pid = pcntl_fork();
-
- if ($pid == -1)
- {
- throw new Exception('fork子进程失败');
- }
- elseif ($pid > 0)
- {
- //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端
- exit(0);
- }
-
- // 最重要的一步,让该进程脱离以前的会话,终端,进程组的控制
- posix_setsid();
-
- // 修改当前进程的工做目录,因为子进程会继承父进程的工做目录,修改工做目录以释放对父进程工做目录的占用。
- chdir('/');
-
- /*
- * 经过上一步,咱们建立了一个新的会话组长,进程组长,且脱离了终端,可是会话组长能够申请从新打开一个终端,为了不
- * 这种状况,咱们再次建立一个子进程,并退出当前进程,这样运行的进程就再也不是会话组长。
- */
- $pid = pcntl_fork();
- if ($pid == -1)
- {
- throw new Exception('fork子进程失败');
- }
- elseif ($pid > 0)
- {
- // 再一次退出父进程,子进程成为最终的守护进程
- exit(0);
- }
-
- // 因为守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符
- fclose(STDIN);
- fclose(STDOUT);
- fclose(STDERR);
-
- /*
- * 处理业务代码
- */
-
- while(TRUE)
- {
- file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);
- sleep(5);
- }