您的位置:首页 > 编程语言 > PHP开发

PHP创建守护进程(有遗留问题)

2013-11-20 18:59 381 查看
因为项目需要,需要写一个守护进程,虽然用crontab也是可以实现的,但是crontab存在许多的不足(容易产生overlap,数据无法共享)

在别人的blog里看到了守护进程的实现(unix),因此在linux环境中用php语言实现原理也是一样的,因此可以借鉴。

先普及一下进程组,会话,控制终端:

a.一个会话可以对应多个进程组

b.一个会话只能对应一个控制终端

c.进程组组长无法创建一个新的会话,但是可以创建控制终端

b.进程组的组员可以创建一个新的会话,但无法创建控制终端

c.进程只能属于一个进程组,也必定属于一个进程组

创建守护进程:

1.使用pcntl_fork()创建一个子进程(同时退出父进程)

2.使用posix_setsid()新创建一个session

关于posix_setsid()的说明:

当它调用成功的时候,会创建一个新的session,并把当前的进程设置为session leader。(从而脱离之前的session,之前的session是通过终端建立连接然后创建的。)同时也会脱离当前的进程组,创建一个新的进程组并且担任进组组长。同时新创建的session没有控制终端。

3.创建无法创建控制终端的进程(重新pcntl_fork一个子进程,退出父进程)

4.修改它的工作目录(因为工作目录可能被umount)

5.修改工作目录的权限(子进程继承父进程的文件和文件权限)

6.处理SIGCHLD信号()

上代码:

<?php
declare(ticks = 1);

$pid = pcntl_fork();
if($pid>0){
echo "parent pid".getmypid();
exit(0);
}

echo "child pid".getmypid();
chdir("/");
posix_setsid();
umask(0);

$pid_d = pcntl_fork();
if($pid_d > 0){
echo "Daemon PID $pid_d";
exit(0);
}
funzioneDemo();
function funzioneDemo(){
while(true){
$handle = fopen("/tmp/demon1e.log","w+");
fput($handle, time());
fclose($handle);
}
}
?>


这个在centos系统中运行不正常,在ubuntu中运行正常。(内部原因不详,需要深入了解)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进程 php