标签:
一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork()
在glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,PHP程序实现守护进程化有2种方法:
nohup php myprog.php > log.txt &
&
,这样执行程序虽然也是转为后台运行,但实际上是依赖终端的,当用户退出终端时进程就会被杀掉。需要使用nohup来实现
<?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()
其它事项说明:
标签:
原文地址:http://www.cnblogs.com/linzhenjie/p/5485219.html