PHP рдбреЗрдореЙрди

рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдУрдЭрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ: рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ phpDaemon рдФрд░ System_Daemon рдХреНрдпрд╛ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реЗрдЦ рдкрдврд╝рддрд╛ рд╣реВрдВ, рдФрд░ рдПрдХ рд╣рд╛рдм рдкрд░ рднреАред

рддреЛ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рддрдп рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рджрд╛рдирд╡ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡рд╣ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рдо рдХрдВрд╕реЛрд▓ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ


//    //    pcntl_fork()    :    $child_pid = pcntl_fork(); if ($child_pid) { //   ,   ,  exit(); } //    . posix_setsid(); //      ,      


Pcntl_fork () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪрд░ $ child_pid рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрд╣ 0 рд╣реЛрдЧрд╛), рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░реЗрдЧреАред рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧреАред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдбреЗрдореЙрди рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА (рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕рд╣рд┐рдд) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рд╣рд╛рдВ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ


 $baseDir = dirname(__FILE__); ini_set('error_log',$baseDir.'/error.log'); fclose(STDIN); fclose(STDOUT); fclose(STDERR); $STDIN = fopen('/dev/null', 'r'); $STDOUT = fopen($baseDir.'/application.log', 'ab'); $STDERR = fopen($baseDir.'/daemon.log', 'ab'); 

рдпрд╣рд╛рдВ рд╣рдо рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдмрд╕, рдЕрдЧрд░ STDIN / dev / null рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рджрд╛рдирд╡ рдХрдВрд╕реЛрд▓ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝реЗрдЧрд╛ - рдпрд╣ рдЙрд╕рд╕реЗ рдЕрдЫреВрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдбреЗрдореЙрди рдХреЗ рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реЛрдВрдЧреЗред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


 include 'DaemonClass.php'; $daemon = new DaemonClass(); $daemon->run(); 

рдЬрдм рд╣рдордиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред DaemonClass.php рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдбреЗрдореЙрди рдХрд╛ рдореВрд▓ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

DaemonClass.php


 //    PHP     declare(ticks=1); class DaemonClass { //     public $maxProcesses = 5; //    TRUE,    protected $stop_server = FALSE; //       protected $currentJobs = array(); public function __construct() { echo "onstructed daemon controller".PHP_EOL; //   SIGTERM  SIGCHLD pcntl_signal(SIGTERM, array($this, "childSignalHandler")); pcntl_signal(SIGCHLD, array($this, "childSignalHandler")); } public function run() { echo "Running daemon controller".PHP_EOL; //  $stop_server    TRUE,    while (!$this->stop_server) { //       ,    while(count($this->currentJobs) >= $this->maxProcesses) { echo "Maximum children allowed, waiting...".PHP_EOL; sleep(1); } $this->launchJob(); } } } 

рд╣рдо рд╕рдВрдХреЗрдд SIGTERM (рд╢рдЯрдбрд╛рдЙрди) рдФрд░ SIGCHLD (рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ) рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЕрдирдВрдд рд▓реВрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдбреЗрдореЙрди рд╕рдорд╛рдкреНрдд рди рд╣реЛред рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдпрджрд┐ рдирд╣реАрдВред

  protected function launchJob() { //    //    pcntl_fork()   //  :    $pid = pcntl_fork(); if ($pid == -1) { //      error_log('Could not launch new job, exiting'); return FALSE; } elseif ($pid) { //      $this->currentJobs[$pid] = TRUE; } else { //       echo "  ID ".getmypid().PHP_EOL; exit(); } return TRUE; } 

pcntl_fork () рд░рд┐рдЯрд░реНрди -1 рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ $ pid рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдпрд╣ рдЪрд░ рдмрдЪреНрдЪреЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрд╣ 0 рд╣реЛрдЧрд╛)ред

  public function childSignalHandler($signo, $pid = null, $status = null) { switch($signo) { case SIGTERM: //        $this->stop_server = true; break; case SIGCHLD: //       if (!$pid) { $pid = pcntl_waitpid(-1, $status, WNOHANG); } //      while ($pid > 0) { if ($pid && isset($this->currentJobs[$pid])) { //      unset($this->currentJobs[$pid]); } $pid = pcntl_waitpid(-1, $status, WNOHANG); } break; default: //    } } 

SIGTERM - рд╕рд╣реА рд╢рдЯрдбрд╛рдЙрди рдХрд╛ рд╕рдВрдХреЗрддред SIGCHLD - рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрддред рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред SIGTERM рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░реЗрдВ - рд╣рдорд╛рд░рд╛ "рдЕрдВрддрд╣реАрди рд▓реВрдк" рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдбреЗрдореЙрди рдХреА рдХрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

UPD: Dlussky habrayuzer рдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ PHP> = 5.3.0 рдореЗрдВ рдбрд┐рдХреНрд▓реЗрдпрд░ (рдЯрд┐рдХ = 1) рдХреЗ рдмрдЬрд╛рдп pcntl_signal_dispatch () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

Source: https://habr.com/ru/post/In134620/


All Articles