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

因为项目需要,需要写一个守护进程,虽然用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中运行正常。(内部原因不详,需要深入了解)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值