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中运行正常。(内部原因不详,需要深入了解)
在别人的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中运行正常。(内部原因不详,需要深入了解)
相关文章推荐
- Linux环境下,使用PHP创建一个守护进程
- PHP 如何创建守护(daemon)进程
- php 创建守护进程
- php开发一个守护进程
- 守护进程的创建方法和步骤
- 创建守护进程
- ubuntu 下创建crontab守护进程
- 使用php来做守护进程
- linux守护进程原理及创建详解
- 如何创建守护进程
- 创建守护进程的步骤
- 创建yii骨架时,遇到php.exe不是内部或外部命令。。。。的问题
- PHP程序级守护进程的实现与优化的使用概述
- 如何创建守护进程(转)
- 一个简单的GNU 守护进程的创建
- 创建守护进程步骤与setsid() -- linux
- 守护进程的详解与创建
- PHP模拟守护进程
- (三)实验2-2-2 vfork创建子进程----运行结果问题
- PHP守护进程实例