PHP 实现守护进程

简介: 守护进程守护进程作为一种常驻进程服务,很常见,例如 PHP-FPM, NGINX,REDIS,都需要一个父进程来支持整个服务。但是用 PHP 编写守护进程不多见,今天就来用 PHP 来实现一下。步骤● fork 子进程● 父进程退出● 设置新的会话● 重置文件掩码● 关闭标准输入输出实现我们对着以上的步骤来实现,在这之前需要 pcntl 和 posix 扩展,请确保安装了。

__20191105201554
守护进程

守护进程作为一种常驻进程服务,很常见,例如 PHP-FPM, NGINX,REDIS,都需要一个父进程来支持整个服务。但是用 PHP 编写守护进程不多见,今天就来用 PHP 来实现一下。

步骤

● fork 子进程

● 父进程退出

● 设置新的会话

● 重置文件掩码

● 关闭标准输入输出

实现

我们对着以上的步骤来实现,在这之前需要 pcntl 和 posix 扩展,请确保安装了。
__20191105201709
细节
__20191105201750
三者结果相同,说明了该进程即使进程组的组长,也是会话首领。

为什么需要 umask (0)

当你在 linux 调用 umask 的时候你会看到一个掩码值,这个掩码决定了你创建文件权限范围,例如本人当前机器的 umask 为

0022

文件的最大权限是 0666,而目录的最大权限是 0777, 那么当前用户的创建的目录权限就是 0755,对于当前用户而言就是 rwx-rx-rx 权限。而文件则是 0644,对于当前用户而言 rw-r-r 权限。所以如果没有重置掩码的话,那么对于目录而言就是 0755,而文件则是 0644 了。

注意

如果你在进程使用了 echo var_dump 等函数,一定要把标准输出等重定向到其他文件流中。新增加下面代码就可以了
__20191105201839
因为在上面已经关闭了标准输入输出,此时文件描述符 fd 已经没有,所有重新打开之后 fd 从非负开始依次是 0,1,2。正好作为标准输入输出的文件。当然重定向到那里需要你自己设置。

最后的二次 fork

这个问题需要好好斟酌,因为是非必须的。目前想不到有什么场景下必须两次 Fork。

以上就是PHP 实现守护进程的详细内容,更多请关注php交流群:link

相关文章
|
11月前
|
PHP
PHP swoole 监听端口进程
PHP swoole 监听端口进程
71 0
|
PHP
PHP:php-fpm进程数控制配置
PHP:php-fpm进程数控制配置
84 0
|
PHP
php实现数字格式化,数字每三位加逗号的功能函数169856420=>169,856,420
php实现数字格式化,数字每三位加逗号的功能函数169856420=>169,856,420
188 0
|
PHP
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
359 0
|
消息中间件 PHP Windows
PHP实现php-amqplib/php-amqplib实例RabbitMq
PHP实现php-amqplib/php-amqplib实例RabbitMq
123 0
|
XML 移动开发 JSON
PHP使用yansongda/pay实现支付宝和微信的支付
PHP使用yansongda/pay实现支付宝和微信的支付
847 0
|
NoSQL PHP Redis
PHP结合redis实现点赞功能
PHP结合redis实现点赞功能
107 0
|
消息中间件 缓存 JSON
PHP实现think-queue介绍
PHP实现think-queue介绍
329 0
|
PHP
php实现定时任务hellogerard/jobby
php实现定时任务hellogerard/jobby
113 0
|
PHP
PHP实现JWT lcobucci/jwt生成jwt token
PHP实现JWT lcobucci/jwt生成jwt token
429 0