会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 站长学院 > 编程程序 > PHP脚本来写Daemon程序

PHP脚本来写Daemon程序

时间:2012-03-26 19:52:07   作者:   来源:   点击:

5、关闭所有不需要的文件。

同文件权限掩码一样,我们的新进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不被我们的daemon进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。需要指出的是,文件描述符为0、1和2的三个文件(文件描述符的概念将在下一章介绍),也就是我们常说的输入、输出和报错这三个文件也需要被关闭。很可能不少读者会对此感到奇怪,难道我们不需要输入输出吗?但事实是,在上面的第2步后,我们的 daemon进程已经与所属的控制终端失去了联系,我们从终端输入的字符不可能达到daemon进程,daemon进程用常规的方法(如printf)输出的字符也不可能在我们的终端上显示出来。所以这三个文件已经失去了存在的价值,也应该被关闭。

使用PHP编写Gearman的Worker守护进程

在我之前的文章中,介绍过Gearman的使用。在我的项目中,我使用了PHP来编写一直运行的Worker。如果按照Gearman官方推荐的例子,只是简单的一个循环来等待任务,会有一些问题,包括:1、当代码进行过修改之后,如何让代码的修改生效;2、重启Worker的时候,如何保证当前的任务处理完成才重启。

针对这个问题,我考虑了以下的解决方法:

1、每次修改完代码后,Worker需要手工重启(先杀死然后启动)。这个只能解决重新加载配置文件的问题。

2、在Worker中设置,单次任务循环完成后,就对Worker进行重启。这个方案的问题在于消耗比较大。

3、在Worker中添加一个退出函数,如果需要Worker退出的时候,在Client端发送一个优先级比较高的退出调用。这个需要客户端配合,在使用后台类任务时,不太适合。

4、在Worker中检查文件是否发生变化,如果发生了变化,退出并重启自身。

5、为Worker编写信号控制,接受重启指令,类似于 http restart graceful 指令。

最后,结合4和5两种方法,可以实现这样一个Daemon,如果配置文件发生了变化,他就会自动重启;如果接受到了用户的 kill -1 pid 信号,也会重新启动。

代码如下:

  1. <?php
  2.  
  3. declare( ticks = 1 );  
  4. // This case will check the config file regularly, if the config file changed, it will restart it self  
  5. // If you want to restart the daemon gracefully, give it a HUP signal  
  6. // by shiqiang<cocowool@gmail> at 2011-12-04  
  7.  
  8. $init_md5 = md5_file( 'config.php');  
  9.  
  10. // register signal handler  
  11. pcntl_signal( SIGALRM, "signal_handler", true );  
  12. pcntl_signal( SIGHUP, 'signal_handler', TRUE );  
  13.  
  14. $job_flag = FALSE;   
  15.  //Job status flag, to justify if the job has been finished  
  16. $signal_flag = FALSE;   
  17.  //Signal status flag, to justify whether we received the kill -1 signal  
  18.  
  19. while( 1 ){  
  20.     $job_flag = FALSE;   
  21.  //Job status flag  
分享到:

网友评论

热门编程程序