рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ, рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП pcntl_fork ()

рдореИрдВ рдЕрдкрдирд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВред
рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рдо рдХреЛ "рд╕рдорд╛рдирд╛рдВрддрд░" рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рд╕рднреА "рдкрд░рд┐рдгрд╛рдореЛрдВ" рдХреЗ рд╕рд╛рде pcntl_fork () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

(рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛)

рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕рд╛рд░:



class some_script extends CliScript
{
protected function processWorker ( $item )
{
$this -> log ( "I'm doing heavy job" );
sleep ( rand ( 1 , 5 ));
$this -> log ( "I'm done doing heavy job" );
}

}

$script = new some_script();
$script -> setWorkers ( 5 );
$script -> run ();


рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдЕрднрд┐рднрд╛рд╡рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ 5 рдмрдЪреНрдЪреЛрдВ рдХреЛ "рднрд╛рд░реА рдХрд╛рдо" рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ: рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрдзрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрдЪреНрдЪреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ "рдЧрдВрджреЗ рдХрд╛рдо" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

class master_and_workers extends CliScript
{
protected $contracts = array ( 2 , 4 , 5 , 1 , 3 , 7 , 3 , 1 , 4 , 9 , 2 , 4 , 1 );
protected $results ;

protected function processMaster ()
{
foreach ( $this -> contracts as $contract )
{
while ( ! $this -> canStartWorker () ) { sleep ( 1 ); };

$this -> startWorker ( $contract );
}

$this -> waitForChildren ();

var_export ( $this -> results );
}

protected function processWorker ( $item )
{
$this -> log ( "I'm busy for { $item } seconds..." );
sleep ( $item );
$this -> log ( "Job is done." );

return "Job is done. Sleep time was { $item } " ;
}

protected function processResult ( $result )
{
$this -> results [] = $result ;
}

}

$script = new master_and_workers();
$script -> setWorkers ( 3 );
$script -> run ();


рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рднреНрд░рдо рд╣реЛ рддреЛ рд╢реАрдШреНрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:

рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛рд╕реНрдЯрд░ () рд╡рд┐рдзрд┐ рдХреЛ рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ processWorker () рдореЗрдердб рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдХрд┐ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рд░рд┐рдЯрд░реНрди рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдкреЗрд░реЗрдВрдЯ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛Result () рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╣реАрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

CliScript рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рд╣реИрдВ:

getRunningTime () рд░рд┐рдЯрд░реНрди рд╕реЗрдХрдВрдбреНрд╕ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реЗ рдЯрд╛рдЗрдо рд░рди рдХрд░рддрд╛ рд╣реИ
countWorkers () рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрдердХ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рд▓реЙрдЧ () рдпрджрд┐ CliScript :: рдлрд╝рд╛рдЗрд▓ file_log рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕реНрдХреНрд░реАрди рдкрд░ред рдХреМрди рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреВрд░реА рдХрдВрдкрдиреА рдХреЛ "рдзреАрд░реЗ рд╕реЗ" рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ SIGTERM рд╕рдВрдХреЗрдд рднреЗрдЬреЗрдВ, рдПрдХ рдЖрджрд┐рдо рд╣реИрдВрдбрд▓рд░ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВред



рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдХреЛрдб рд░рди-рдЗрди рдФрд░ рд▓рд╛рдЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рдкрд░реАрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдкреАрдпреВ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред

CliScript рд╡рд░реНрдЧ рд╕реНрд░реЛрдд

рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рд╡рд┐рдХрд╛рд╕ рд╣реИ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред

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


All Articles