返回列表 回复 发帖

PHP Daemon/worker environment

  1. <?
  2. define('WANT_PROCESSORS', 5);
  3. define('PROCESSOR_EXECUTABLE', '/path/to/your/processor');
  4. set_time_limit(0);
  5. $cycles = 0;
  6. $run = true;
  7. $reload = false;
  8. declare(ticks = 30);

  9. function signal_handler($signal) {
  10.     switch($signal) {
  11.     case SIGTERM :
  12.         global $run;
  13.         $run = false;
  14.         break;
  15.     case SIGHUP  :
  16.         global $reload;
  17.         $reload = true;
  18.         break;
  19.     }   
  20. }

  21. pcntl_signal(SIGTERM, 'signal_handler');
  22. pcntl_signal(SIGHUP, 'signal_handler');

  23. function spawn_processor() {
  24.     $pid = pcntl_fork();
  25.     if($pid) {
  26.         global $processors;
  27.         $processors[] = $pid;
  28.     } else {
  29.         if(posix_setsid() == -1)
  30.             die("Forked process could not detach from terminal\n");
  31.         fclose(stdin);
  32.         fclose(stdout);
  33.         fclose(stderr);
  34.         pcntl_exec(PROCESSOR_EXECUTABLE);
  35.         die('Failed to fork ' . PROCESSOR_EXECUTABLE . "\n");
  36.     }
  37. }

  38. function spawn_processors() {
  39.     global $processors;
  40.     if($processors)
  41.         kill_processors();
  42.     $processors = array();
  43.     for($ix = 0; $ix < WANT_PROCESSORS; $ix++)
  44.         spawn_processor();
  45. }

  46. function kill_processors() {
  47.     global $processors;
  48.     foreach($processors as $processor)
  49.         posix_kill($processor, SIGTERM);
  50.     foreach($processors as $processor)
  51.         pcntl_waitpid($processor);
  52.     unset($processors);
  53. }

  54. function check_processors() {
  55.     global $processors;
  56.     $valid = array();
  57.     foreach($processors as $processor) {
  58.         pcntl_waitpid($processor, $status, WNOHANG);
  59.         if(posix_getsid($processor))
  60.             $valid[] = $processor;
  61.     }
  62.     $processors = $valid;
  63.     if(count($processors) > WANT_PROCESSORS) {
  64.         for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
  65.             posix_kill($processors[$ix], SIGTERM);
  66.         for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
  67.             pcntl_waitpid($processors[$ix]);
  68.     } elseif(count($processors) < WANT_PROCESSORS) {
  69.         for($ix = count($processors); $ix < WANT_PROCESSORS; $ix++)
  70.             spawn_processor();
  71.     }
  72. }

  73. spawn_processors();

  74. while($run) {
  75.     $cycles++;
  76.     if($reload) {
  77.         $reload = false;
  78.         kill_processors();
  79.         spawn_processors();
  80.     } else {
  81.         check_processors();
  82.     }
  83.     usleep(150000);
  84. }
  85. kill_processors();
  86. pcntl_wait();
  87. ?>
复制代码
Postfix技术专业支持论坛
http://www.thismail.org/bbs
-----------------------------------
提供专业postfix技术支持,邮件系统开发定制
QQ:187159779 注明(Postfix技术支持)
返回列表
开源邮件服务器 开源邮件服务器 web 开源邮件 开源 mail 开源 邮件服务器 邮件技术 mail技术 反垃圾邮件 反垃圾mail mail投递
邮件服务器 mail服务器 开源软件 mail软件 mail服务新品牌 开源邮件服务新品牌
开源mail服务新网站 邮件服务新品牌 mail tmail mailserver 163邮件 sendmail |Linux维护|Linux代维|成都Linux维护|成都Linux代维