一个守护进程一般补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。经常使用的实现方式是fork() -> setsid() -> fork()
php
在glibc里有一个函数daemon。调用此函数,就可以使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,PHP程序实现守护进程化有2种方法:session
nohup php myprog.php > log.txt &
函数
&
,这样执行程序虽然也是转为后台运行,但其实是依赖终端的,当用户退出终端时进程就会被杀掉。须要使用nohup来实现code
<?php function daemon() { $pid = pcntl_fork(); if($pid < 0){ die("fork(1) failed!\n"); }elseif($pid > 0){ exit; //让终端启动的进程退出 } chdir("/"); //改变当前目录为根目录 umask(0); //重设文件权限掩码 //创建一个有别于终端的新session以脱离终端 $sid = posix_setsid(); if (!$sid) { die("setsid failed!\n"); } $pid = pcntl_fork(); if($pid < 0){ die("fork(1) failed!\n"); }elseif($pid > 0){ exit; //父进程退出, 剩下子进程成为最终的独立进程 } //关闭标准I/O流 if (defined('STDIN')) { fclose(STDIN); } if (defined('STDOUT')){ fclose(STDOUT); } if (defined('STDERR')) { fclose(STDERR); } } daemon(); sleep(1000);
这里较为关键的二个php函数是pcntl_fork()和posix_setsid()继承
其它事项说明:进程