
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
PHP рдореЗрдВ рдбреЗрдореЛрдВрд╕ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрдиреНрдп рдЬрд╛рд▓реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Habr рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рдереЗред рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдПрдХ рд╕рдорд╛рди рдкрд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХреБрдЫ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИ -
рдХрдИ PHP рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди ред
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд
рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА
рд╢рдмреНрджрд╛рд╡рд▓реА ред
- рдиреМрдХрд░реА рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╣реИред рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ "php test.php" - рдпрд╣рд╛рдБ рдХрд╛рдо рд╣реИред
- рдиреМрдХрд░реА рдкреНрд░рдмрдВрдзрдХ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрдХ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИред рдЕрдкрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХрд╛
рд▓рдХреНрд╖реНрдп рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдФрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИред
рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ
proc_open рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдкрдХреЛ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП I / O рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреМрдХрд░реА рд╡рд░реНрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХрд╛рд░реНрдп рдирд╛рдо рдФрд░ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
class Job { protected $_pid = 0; protected $_name; protected $_cmd = ''; protected $_stderr = '/dev/null'; private $_resource = NULL; private $_pipes = array(); private $_waitpid = TRUE; public function __construct($cmd, $name = 'job') { $this->_cmd = $cmd; $this->_name = $name; } public function __destruct() {
рдиреМрдХрд░рд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Job_Manager рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреВрд░реА рдпреЛрдЬрдирд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
class Job_Manager { private $_pool_size = 20; private $_pool = array(); private $_streams = array(); private $_stderr = array(); private $_is_terminated = FALSE; protected $_dispatch_function = NULL; public function __construct() {
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрдореВрд░реНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
class Executable { protected $_is_terminated = FALSE; protected $_cleanup_function = NULL; public function __construct() {
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо "рдиреАрдВрдж" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рд╕реЛ рдЬрд╛рдПрдЧреА рдФрд░ STDOUT рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧреАред
sleep.php class SleeperTest extends Executable { public function sleep() { for($i = 0; !$this->isTerminated() && $i < 10; $i++) { ob_start(); echo $i . "\n"; ob_end_flush(); sleep(5); } } } $s = new SleeperTest; $s->sleep();
pm.php $pm = new Job_Manager; $pm->startJob('php sleep.php', 'sleeper1'); $pm->startJob('php sleep.php', 'sleeper2');
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдФрд░ рд╕реНрдЯреНрд░реАрдо_рд╕реЗрд▓реЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдореЙрди рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЪрдХреНрд░ рдореЗрдВ рдЙрдЪреНрдЪ рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ рдЗрд╕ рдЦрд╛рдореА рд╕реЗ рд░рд╣рд┐рдд рд╣реИ, рд╕рдм рдХреБрдЫ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╢рд╛рдВрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрджреНрдпрддрдиред рдореИрдВрдиреЗ рдХрдХреНрд╖рд╛ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ github
https://github.com/xzag/php-pm рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ