PHP рдореЗрдВ UNIX рдбреЗрдореЛрдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдХреНрд╕рд░ рдЖрдкрдХреЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдПрдХ рдбреЗрдореЙрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рдордп, рдореИрдВ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдорди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдФрд░ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдореИрдВрдиреЗ PHP рдореЗрдВ рдПрдХ рд╣реА рд░рдЪрдирд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛, рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреЛ, рдЪрд▓реЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рд╕реНрд░реЛрдд bitbucket.org рдФрд░ GitHub рдкрд░ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ), рдкреНрд░рд▓реЗрдЦрди рднреА рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдБ рдХрдХреНрд╖рд╛ рдХрд╛ рд╣реА рдХреЛрдб рд╣реИ:

<?php /* Author: Petr Bondarenko E-mail: public@shamanis.com Date: 31 May 2012 License: BSD Description: Class for create UNIX-daemon */ class DaemonException extends Exception {} abstract class DaemonPHP { protected $_baseDir; protected $_chrootDir = null; protected $_pid; protected $_log; protected $_err; /** *  .    pid- * @param string $path    PID- */ public function __construct($path=null) { $this->_baseDir = dirname(__FILE__); $this->_log = $this->_baseDir . '/daemon-php.log'; $this->_err = $this->_baseDir . '/daemon-php.err'; if ($path === null) { $this->_pid = $this->_baseDir . '/daemon-php.pid'; } else { $this->_pid = $path; } } /** *    log- * @param string $path    log- * @return DaemonPHP */ final public function setLog($path) { $this->_log = $path; return $this; } /** *    err- * @param string $path    err- * @return DaemonPHP */ final public function setErr($path) { $this->_err = $path; return $this; } /** *    , *     chroot   . *       . * @param string $path   chroot- */ final public function setChroot($path) { if (!function_exists('chroot')) { throw new DaemonException('Function chroot() has no. Please update you PHP version.'); } $this->_chrootDir = $path; return $this; } /** *    ,  double fork */ final protected function demonize() { $pid = pcntl_fork(); if ($pid == -1) { throw new DaemonException('Not fork process!'); } else if ($pid) { exit(0); } posix_setsid(); chdir('/'); $pid = pcntl_fork(); if ($pid == -1) { throw new DaemonException('Not double fork process!'); } else if ($pid) { $fpid = fopen($this->_pid, 'wb'); fwrite($fpid, $pid); fclose($fpid); exit(0); } posix_setsid(); chdir('/'); ini_set('error_log', $this->_baseDir . '/php_error.log'); fclose(STDIN); fclose(STDOUT); fclose(STDERR); $STDIN = fopen('/dev/null', 'r'); if ($this->_chrootDir !== null) { chroot($this->_chrootDir); } $STDOUT = fopen($this->_log, 'ab'); if (!is_writable($this->_log)) throw new DaemonException('LOG-file is not writable!'); $STDERR = fopen($this->_err, 'ab'); if (!is_writable($this->_err)) throw new DaemonException('ERR-file is not writable!'); $this->run(); } /** *   PID  * @return int PID  */ final protected function getPID() { if (file_exists($this->_pid)) { $pid = (int) file_get_contents($this->_pid); if (posix_kill($pid, SIG_DFL)) { return $pid; } else { //   ,  PID-  unlink($this->_pid); return 0; } } else { return 0; } } /** *       demonize() */ final public function start() { if (($pid = $this->getPID()) > 0) { echo "Process is running on PID: " . $pid . PHP_EOL; } else { echo "Starting..." . PHP_EOL; $this->demonize(); } } /** *    */ final public function stop() { if (($pid = $this->getPID()) > 0) { echo "Stopping ... "; posix_kill($pid, SIGTERM); unlink($this->_pid); echo "OK" . PHP_EOL; } else { echo "Process not running!" . PHP_EOL; } } /** *      stop()  start() */ final public function restart() { $this->stop(); $this->start(); } /** *     */ final public function status() { if (($pid = $this->getPID()) > 0) { echo "Process is running on PID: " . $pid . PHP_EOL; } else { echo "Process not running!" . PHP_EOL; } } /** *      */ final public function handle($argv) { switch ($argv[1]) { case 'start': $this->start(); break; case 'stop': $this->stop(); break; case 'restart': $this->restart(); break; case 'status': $this->status(); break; default: echo "Unknown command!" . PHP_EOL . "Use: " . $argv[0] . " start|stop|restart|status" . PHP_EOL; break; } } /** *   ,    . *    */ abstract public function run(); } ?> 


рддреБрд░рдВрдд рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдм рддрдХ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ phpdoc рд╕реЗрдХреНрд╢рди рд▓рд┐рдЦреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдбреЗрдорди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ DaemonPHP рд╡рд░реНрдЧ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдореВрд░реНрдд рд░рди () рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рдбреЗрдорди рдХрд╛ рдХреЛрдб рд╣реЛрдЧрд╛:

 <?php require_once 'daemon.php'; class MyDaemon extends DaemonPHP { public function run() { while (true) { } } } $daemon = new MyDaemon('/tmp/test.pid'); $daemon->setChroot('/home/shaman/work/PHPTest/daemon') //   chroot ->setLog('/my.log') ->setErr('/my.err') // chroot     /home/shaman/work/PHPTest/daemon ->handle($argv); } ?> 


рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдордиреЗ MyDaemon рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛, рдЬреЛ DaemonPHP рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ ред DaemonPHP рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдпрд╣ рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐ рд░рди () рд╣реИ ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдирд┐рдХрд╛рдп рдореЗрдВ рд╡рд╣ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рдбреЗрдореЙрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд╛рдирд╡ рдХреЛ рдХрд╛рдо рдХрд░рддреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЦрд╛рд▓реА рдЕрдВрддрд╣реАрди рд▓реВрдк рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ MyDaemon рд╡рд░реНрдЧ рдХреА $ рдбреЗрдореЙрди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛, рдирд┐рд░рдкреЗрдХреНрд╖ рдкрде рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдбреЗрдореЙрди рдХреА PID рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА; рдпрджрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ PID рдлрд╝рд╛рдЗрд▓ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА рдЬрд╣рд╛рдВ рдбреЗрдорди рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИред -php.pid рдЕрдЧрд▓рд╛, рд╣рдо рд╕реЗрдЯрдХреНрд░реЛрдЯ () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрд░реЛрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рддреБрд░рдВрдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ, рдЪреЗрд░реЛрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░реВрдЯ рд╕реЗ рдбреЗрдореЙрди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдИрдЖрд░рдЖрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВред рдпрджрд┐ рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдбреЗрдореЙрди-php.log рдФрд░ рдбреЗрдорди-php.err рдлрд╛рдЗрд▓реЗрдВ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреАред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрди рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рддреБрд░рдВрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдЧрд▓рд╛, рд╣рдо рд╣реИрдВрдбрд▓ () рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо $ argv рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ-рдХреЗрд╕ рдирд┐рд░реНрдорд╛рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рд╕реЛрдЪреЗрдВред рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХрд░реЗрдВ, рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рд╛рд░рдВрдн () , рд╕реНрдЯреЙрдк () , рдкреБрдирдГ рдЖрд░рдВрдн () , рд╕реНрдерд┐рддрд┐ () рд╣реИрдВ ред рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рддрд░реНрдХ рд╕реЗ рд╣реИрдВрдбрд▓ () рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ php_error.log рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрдм PHP рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд▓реЙрдЧ рд▓рд┐рдЦрддрд╛ рд╣реИред
рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, run.php рдФрд░ run рдирд╛рдо рдХреЗ рддрд╣рдд:

user@localhost:~$ php run.php start
Starting...
user@localhost:~$


рдЖрдк рдЙрдкрдпреБрдХреНрдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

user@localhost:~$ php run.php status
Process is running on PID: 6539


рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд╣рдо рджрд╛рдирд╡ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ:

user@localhost:~$ php run.php stop
Stopping ... OK


рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд╡реАрдирддрдо рдХреЛрдб рд╣рдореЗрд╢рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рд▓рд┐рдВрдХ рдКрдкрд░ рдерд╛) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЦреИрд░, рдпрд╣ рд╕рдм, рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕рд▓рд╛рд╣ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

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


All Articles