PHP守护进程在C和PHP环境中的实现
本文介绍了在C和PHP环境下实现PHP守护进程的方法和示例代码,并一起学习。
什么是守护进程?
守护进程通常被视为不控制终端的后台任务。它有三个显著的特点:在后台运行,与启动它的进程分离,不需要控制终端。常见的实现是fork()-setsid()-fork()
glibc中有一个函数守护程序。通过调用这个函数,当前进程可以与终端分离,成为一个守护进程。有关详细信息,请参见man守护程序。PHP中暂时没有这样的功能,在PHP程序中实现守护进程有两种方式:
1.使用系统命令nohup
NOHUP PHP myprog.php log . txt之类的执行程序是转向后台运行的,但实际上是依赖终端的,用户退出终端会杀死进程。它需要使用nohup来实现
2.使用监督工具(建议使用该方案)
详细解释主管的教程
3.当然也可以通过程序实现(不推荐生产环境)。
# include # include # include # include # include # include//实现守护进程步骤void crete _ daemon(void){ PID _ tpid=0;PID=fork();if(PID 0){ perror(' fork ');出口(-1);}if (pid 0){//1。父进程直接退出exit(0);}//2.//这里的执行是一个子流程。//setsid将当前进程设置为新会话,目的是//将当前进程留在控制台之外,成为守护进程。PID=setsid();if(PID 0){ perror(' setsid ');出口(-1);}//3.将当前进程的工作目录设置为根目录,独立于其他chdir('/');//4.将umask设置为0,以确保未来进程具有最大文件操作权限umask(0);//5.关闭文件描述符//首先,获取当前系统允许打开的最大文件描述符个数,int I=0;int CNT=sysconf(_ SC _ OPEN _ MAX);for(I=0;一、测试结果:
守护程序:
这里的两个关键php函数是pcntl_fork()和posix_setsid()
Fork()是一个进程,这意味着创建一个正在运行的进程的副本,该副本被认为是一个子进程,而原始进程被认为是一个父进程。当fork()运行时,可以脱离启动他的进程和终端控制,这意味着父进程可以自由退出。Setsid(),首先使新进程成为新会话的“领导者”,最后使新进程不再控制终端,也是成为守护进程最关键的一步,这意味着进程不会随着终端关闭而被迫退出。对于不会被中断的常驻流程来说,这是至关重要的一步。最后一次使用Fork()。这一步不是必须的,但通常会完成。它最大的意义就是防止控制终端被获取。(当一个终端设备直接打开并且没有使用O _ NOCTTY标志时,将获得控制终端。)
其他事项说明:
chdir()守护进程默认继承父进程的当前工作目录,当系统磁盘上发生umount时会造成很多麻烦。一般使用“/”作为守护进程当前的工作目录,可以避免上述问题。umask()守护进程默认继承了父进程的文件权限屏蔽,给子进程使用文件带来了很多麻烦。因此,将文件权限屏蔽设置为0可以大大增强守护程序的灵活性。FClose (stdin)、FClose (stdout)和FClose (stderr)关闭标准的I/O流。使用fork函数创建的新子进程将从父进程继承一些打开的文件。这些打开的文件可能永远不会被守护程序读取或写入,但它们也会消耗系统资源,并可能导致它们所在的文件系统被卸载。
版权声明:PHP守护进程在C和PHP环境中的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。