资讯专栏INFORMATION COLUMN

记录php daemon 进程 遇到的问题--posix_setsid函数

浠ラ箍 / 1747人阅读

摘要:则发现程序并不会完整输出行数据,只是部分数据。如不关闭,将会浪费系统资源,这倒是小事,造成进程所在的文件系统无法卸下以及引起无法预料的错误。所以需要关闭这些关闭标准输入输出与错误显示。

总结一下先~

一个守护进程一般需要root权限,因为可能要使用特殊端口1-1024及其他权限

一个守护进程的父进程会被fork之后被杀掉,所以可以说他的父进程是init进程。

一个守护进程无需交互,也和终端(teriminalsession)无关,所以任何输出,无论是向标准输出还是错误输出,都需要特殊处理,涉及到的就是stdout和stderr

上代码

下面是我用php 编写一个守护进程 demo


好下面我们执行操作,输出如下

root@tb:/home/tb/linuxing# php php_daemon.php 
fork succ
loop0
root@tb:/home/tb/linuxing# loop1
loop2
loop3
loop4
...
loop20

查看demo.txt

cat demo.txt 
0--2016-07-15 17:49:47
1--2016-07-15 17:49:48
2--2016-07-15 17:49:49
...
问题来了

貌似没有问题,但是用以上php代码,执行后,马上关闭当前终端。则发现程序并不会完整输出20行数据,只是部分数据。
问题复现步骤:
1.ubuntu终端Azhong 执行 php php_daemon.php
2.关闭终端A
3.打开新终端B,ps -aux |grep php 发现无此进程

如果手慢,自己把握时间或者调整for 次数。。

为什么呢

进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,(这倒是小事),造成进程所在的文件系统无法卸下以及引起无法预料的错误。
所以需要关闭这些

    fclose(STDIN),fclose(STDOUT),fclose(STDERR)

关闭标准输入输出与错误显示。

正确代码之一

再解释一下

如果想在关闭当前终端后继续执行
需要关闭echo 那一行,因为当然echo 和当然session关联,sesssion关闭后,echo就会导致php致命错误,所以下面的file_put_contents不会执行。

所以为了避免除显示输出的echo导致php错误的问题,我们一般建议这样

      global $STDOUT, $STDERR;
      fclose(STDOUT);
      fclose(STDERR);
      $STDOUT = fopen("/dev/null", "rw+");
      $STDERR = fopen("/dev/null", "rw+");
      

加上上面那句,所有的显示的不显示的echo err之类都可以被忽略。也就是说你把
echo "loop" . $i . "n";这句加上也没有问题
指到dev/null,,如果你不这样,你的stdout会跟你的session有关。。
你的session一关,你的stdout就失效,,echo就报错了。

更优处理办法

感谢

三金 CFC4N

守护进程详解及创建,daemon()使用

不懂的太多

当然这只是个例子,实际中还需要考虑目录权限,umask,figchld信号。这些我还没接触。。。

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

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

相关文章

  • PHP进程初探 --- 再次谈daemon进程

    摘要:因为子进程一定不会是组长进程,所以子进程可以调用。主进程退出子进程继续执行啦啦啦,啦啦啦,啦啦啦,已经变成啦,开心一般服务器软件都有写配置项,比如以模式运行还是以模式运行。 [原文地址:https://blog.ti-node.com/blog...] 其实前面是谈过一次daemon进程的,但是并涉及过多原理,但是并不影响使用。今天打算说说关于daemon进程更多的二三事,本质上说,如...

    fox_soyoung 评论0 收藏0
  • 守护进程

    摘要:守护进程为什么需要守护进程呢普通进程在运行时可以被控制终端发出的信号打断而守护进程由于脱离了控制终端所以不会被其打断守护进程创建的标准流程调用设置文件创建的掩码子进程并关闭父进程调用创建新会话把当前工作目录切换为根目录不需要的文件描述符全部 守护进程 为什么需要守护进程呢? 普通进程在运行时可以被控制终端发出的信号打断, 而守护进程由于脱离了控制终端, 所以不会被其打断. 守护进程创建...

    Carbs 评论0 收藏0
  • PHP进程系列笔记(四)

    摘要:本节主要讲解常用函数和进程池的概念,也会涉及到守护进程的知识。所以任何时候,建议预先创建好进程,也就是使用进程池的方式实现。 本节主要讲解Posix常用函数和进程池的概念,也会涉及到守护进程的知识。本节难度较低。 Posix常用函数 posix_kill 向指定pid进程发送信号。成功时返回 TRUE , 或者在失败时返回 FALSE 。 bool posix_kill ( int $...

    Cc_2011 评论0 收藏0
  • workerman 简要分析

    摘要:后面每开启一个子进程,会将子进程的存储到中,用来后面主进程监控子进程,如果子进程意外终止,主进程可以重新佛。将当前子进程设置为会话组再次创建子进程,为了防止在的系统下重新打开控制终端。 wokerman 启动分析 @(学习)[workerman, php] 前期想说的 也是最近才看的代码,遇到不懂得地方就去google,所以这篇文章里面穿插了很多参考资料,可以直接点击阅览。 需要了解一...

    senntyou 评论0 收藏0
  • workerman笔记-php创建守护进程

    摘要:守护进程常常在系统引导装入时启动,在系统关闭时终止。进程组有进程组来唯一标识。且该进程组不会因组长进程的退出而受到影响。 使用函数 pcntl_fork();//创建子进程 posix_setsid();//设置当前进程为进程组长 posix_getpid();//获取进程id 例子 workerman中将进程 /** * Run as deamon mode. * * @th...

    Cristic 评论0 收藏0

发表评论

0条评论

浠ラ箍

|高级讲师

TA的文章

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