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

来源:互联网 发布:sql查询字段包含字母 编辑:程序博客网 时间:2024/05/16 07:48

因为项目需要,需要写一个守护进程,虽然用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信号()


上代码:

<?phpdeclare(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中运行正常。(内部原因不详,需要深入了解)

原创粉丝点击