资讯专栏INFORMATION COLUMN

守护进程之PHP实现

lily_wang / 3101人阅读

摘要:什么是守护进程守护进程是一种特殊的进程,它的生命周期很长,它在后台运行并且没有控制终端这样可以保证守护进程不会接收到各种来自终端的信号。比如等,都会使用守护进程的形式运行,确保可以一直正常的提供服务。

什么是守护进程

守护进程(daemon)是一种特殊的进程,它的生命周期很长,它在后台运行并且没有控制终端(这样可以保证守护进程不会接收到各种来自终端的信号)。
比如:crontab、sshd、nginx等,都会使用守护进程的形式运行,确保可以一直正常的提供服务。

如何实现守护进程

fork子进程,父进程退出(当前子进程会成为init进程的子进程)

子进程调用setsid(),开启一个新会话,成为新的会话组长,并且释放于终端的关联关系

再次fork子进程,父进程退出(可以防止会话组长重新申请打开终端)

关闭打开的文件描述符

改变当前工作目录chdir

清除进程的umask

PHP实现
/**
 * daemon(守护进程) PHP实现
 * @author zhjx922
 */

$pid = pcntl_fork();
if ($pid == -1) {
    die("创建子进程失败");
} else if ($pid) {
    //第一次退出父进程
    exit(0);
}

//setsid
posix_setsid();

echo "成功输出,脱离终端" . PHP_EOL;
sleep(5);

$pid = pcntl_fork();
if ($pid == -1) {
    die("创建子进程失败");
} else if ($pid) {
    //第二次退出父进程(之前fork出来的子进程)
    exit(0);
}

echo "依然可以输出" . PHP_EOL;
sleep(5);

//关闭各种描述符
@fclose(STDOUT);
@fclose(STDERR);
$STDOUT = fopen("/dev/null", "a");
$STDERR = fopen("/dev/null", "a");

chdir("/");

umask(0);

echo "这里不会输出, ps aux | grep daemon.php 查看进程,20s后退出" . PHP_EOL;
sleep(20);
日常使用已经注意事项

php daemon.php & 这样使用,当关闭终端后,当前php进程也会同时关掉

nohup php daemon.php > daemon.log & 终端关闭后,依然会继续运行

使用supervisor

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22634.html

相关文章

  • PHP玩转进程二 — 多进程PHPServer

    摘要:代码实现启动启动流程见流程,主要包括守护进程保存注册信号处理器创建多进程这部分。模拟调度实际用实现捕获信号其中,会在每次调度过程中,捕获信号并执行注册的信号处理器。 首发于 樊浩柏科学院 经过 用 PHP 玩转进程之一 — 基础 的回顾复习,我们已经掌握了进程的基础知识,现在可以尝试用 PHP 做一些简单的进程控制和管理,来加深我们对进程的理解。接下来,我将用多进程模型实现一个简单的...

    stormjun 评论0 收藏0
  • 使用 Docker 搭建开发环境

    摘要:做了一次分享,主题使用搭建开发环境,简单介绍了一下的概念,演示了使用构建全套环境。应场景通常于如下场景应的动化打包和发布动化测试和持续集成发布在服务型环境中部署和调整数据库或其他的后台应从头编译或者扩展现有的或平台来搭建的环境。 做了一次分享,主题《使用 Docker 搭建开发环境》,简单介绍了一下 Docker 的概念,演示了使用 Docker-compose 构建全套 PHP 环境...

    zxhaaa 评论0 收藏0
  • 使用 Docker 搭建开发环境

    摘要:做了一次分享,主题使用搭建开发环境,简单介绍了一下的概念,演示了使用构建全套环境。应场景通常于如下场景应的动化打包和发布动化测试和持续集成发布在服务型环境中部署和调整数据库或其他的后台应从头编译或者扩展现有的或平台来搭建的环境。 做了一次分享,主题《使用 Docker 搭建开发环境》,简单介绍了一下 Docker 的概念,演示了使用 Docker-compose 构建全套 PHP 环境...

    kycool 评论0 收藏0
  • PHP程序守护进程

    摘要:调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见。命令行程序实现守护进程化有种方法一使用这里就实现了守护进程化。单独执行,当按下时就会中断程序执行,会当前进程以及子进程。 一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别。glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon...

    My_Oh_My 评论0 收藏0
  • PHP回顾进程编程

    摘要:多进程中与多进程相关的两个重要拓展是和。函数执行期间,主进程除了等待无法处理其他任务,所以一般不认为这是多进程编程。回收子进程有两种方式,一种是主进程调用函数等待子进程结束另外一种是处理信号。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 session 数据库操作 加解...

    lifesimple 评论0 收藏0

发表评论

0条评论

lily_wang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<