PHP程序守护进程化

转载自: https://mp.weixin.qq.com/s?__biz=MzI0MjEwMDMzNQ==&mid=403709703&idx=1&sn=08b93d2280649b606b2b003ec8baeb96&scene=0&key=710a5d99946419d9e91dfefbc33d6bead9b7f9cc6f07ea5630fa284b9a79724ef7ca950e42913809c98c7ff89668d298&ascene=0&uin=NTk5OTM1NjIw&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.2+build(14C1514)&version=11020012&pass_ticket=gK0q67uYLL0qKJjSdn5fLOIlxe%2FqEpZhCFmCcQWJtE1RjyXXxMPlt0r5T9n6EdVF

一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别。glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,当然如果你有兴趣的话,可以写一个PHP的扩展函数来实现。

PHP命令行程序实现守护进程化有3种方法:

一 、使用nohup

nohup php myprog.php > log.txt &

这里就实现了守护进程化。

单独执行 php myprog.php,当按下ctrl+c时就会中断程序执行,会kill当前进程以及子进程。

php myprog.php &,这样执行程序虽然也是转为后台运行,实际上是依赖终端的,当用户退出终端时进程就会被杀掉。

二、使用PHP代码来实现

function daemonize()
{
    $pid = pcntl_fork();
    if ($pid == -1){
        die("fork(1) failed!\n");
    }elseif ($pid > 0)
    {//让由用户启动的进程退出
         exit(0);
    }
    //建立一个有别于终端的新session以脱离终端
    posix_setsid();
    $pid = pcntl_fork();
    if ($pid == -1)
    {
        die("fork(2) failed!\n");
    }elseif ($pid > 0)
    {
        //父进程退出, 剩下子进程成为最终的独立进程
        exit(0);
    }
}
daemonize();sleep(1000);

用上面代码即可实现守护进程化,当你的PHP程序需要转为后台运行时,只需要调用一次封装好的函数daemonize()即可。
注:这里没有实现标准输入输出的重定向。

三、使用swoole来实现

<?phpswoole_process::daemon();

swoole扩展提供的process模块,用来替代PHP的pcntl扩展,解决了pcntl很多的不足。像deamon,swoole通过一个函数就可以达到目的.

时间: 2024-10-14 11:33:00

PHP程序守护进程化的相关文章

php程序守护进程

php命令程序实习守护进程2种方式: 1.使用nohup nohup php myprog.php > log.txt & 2.使用程序 function daemonize() { $pid = pcntl_fork(); if ($pid == -1) { die("fork(1) failed!\n"); } elseif ($pid > 0) { //让由用户启动的进程退出 exit(0); } //建立一个有别于终端的新session以脱离终端 posix

PHP系统编程--02.PHP守护进程化

什么是守护进程? 一个守护进程通常补认为是一个不对终端进行控制的后台任务.它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端.常用的实现方式是fork() -> setsid() -> fork() 在glibc里有一个函数daemon.调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon.PHP中暂时没有此函数,PHP程序实现守护进程化有2种方法: 使用系统命令nohup nohup php myprog.php > log.txt &a

Shell: nohup守护进程化

如果想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行,直到其完成,即使你退出了终端会话,可以使用nohup命令实现.感觉nohup就是将一个进程初始化为一个守护进程. nohup命令运行了另一个命令来阻断所有发送给该进程的SIGHUP信号.这会在退出终端会话时阻止进程退出. 由于nohup命令会从终端解除进程的关联,进程会丢掉到STDOUT和STDIN的链接,为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中.

《网络编程》守护进程

前言 守护进程是在后台运行并独立于所有终端控制的进程.守护进程没有控制终端源于它们通常是由系统初始化脚本启动,但是也有可能从某个终端由用户在 shell 提示符下键入命令行启动,这种启动方式的守护进程必须亲自脱离与控制终端的关联,从而避免与作业控制.终端会话管理.终端产生信号等发生任何不期望的交互,也可以避免在后台运行的守护进程非预期地输出到终端.有关作业控制.终端控制的内容可参考文章<作业控制.终端控制 和 守护进程> 由于守护进程没有控制终端,当守护进程出错时,必须通过某种输出函数输出错误

经典C/S服务器模型之守护进程

linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同 Unix环境下守护进程的编程规则并不一致.

ansible 部署基于windows 2008 r2+rsync+alwaysUp(守护进程)

准备:升级PowerShell3.0 及打开WinRM模块 参考文章:http://juestnow.blog.51cto.com/1515305/1875026 下载软件包rsync http://down.51cto.com/data/371729 alwaysUp https://www.coretechnologies.com/products/AlwaysUp/ AlwaysUpCLT https://www.coretechnologies.com/products/AlwaysUp

开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型

开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print('%s is running' %x) # time.sleep(3) # print('%s is done' %x) # # if __name__ == '__main__': # # Process(target=task,kwargs={'x':'子进程'}) # p=Process(tar

服务器程序后台化以及守护进程的编写规范

一般的服务器程序都是以后台进程(守护进程)的方式运行,那么要如何使得服务器进程后台化呢? 下面介绍守护进程的编写遵循的步骤: 1. 创建子进程,关闭父进程:2. 设置文件权限掩码.当进程创建新文件(使用open(const char *pathname, int flags, mode_t mode)系统调用时,文件的权限将是mode&0777: 3. 创建新会话,设置本进程为进程组的首领: 4. 切换工作目录: 5. 关闭标准输入设备.标准输出设备和标准错误输出设备: 6. 关闭其他已经打开的

Python编写守护进程程序

Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到.在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响.在程序里fork子进程后,父进程退出,对了shell进程来说,这个父进程就算执行完了,而产生的子进程会被init进程接管,从而也就脱离了终端的控制. 2-4