PHP рдореЗрдВ pcntl рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛

PHP рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рдХреБрдЫ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦреЗ рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдХреЗрд╡рд▓ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ PHP 5.5 рдкрд╣рд▓реЗ рд╣реА рд░рд┐рд▓реАрдЬрд╝ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рдФрд░ 5.2 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ PHP 5.2 рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдЙрди рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ PHP рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рднреА рд▓рд┐рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдХреЗ рдкрд╛рд╕ред

PHP рдореЗрдВ pcntl рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ pcntl_signal () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдЧреНрдирд▓ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рд╣реИрдВрдбрд▓рд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рдХреЛрдИ рд╕реВрдЪрдирд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рджреЛ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рд╛рдЗрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдШреБрдорд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдбреЗрдорди, рдЬреЛ рд▓реЙрдЧ рд░реЛрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдЯ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИред рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЗрдХрд┐рди рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреА рд╣реИред рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ (рдЯрд┐рдХ = 1)


5.3 рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШреЛрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг (рдЯрд┐рдХ = 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг php рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИрд░рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдореИрдиреБрдЕрд▓ рдкрдврд╝рддреЗ рд╕рдордп, рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреЗрд╢реЗрд╡рд░ рд░реВрдк рд╕реЗ C ++ рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдбрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдг рд╣реИрдВ:
рдШреЛрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдШреЛрд╖рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ)ред
рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрддреНрдкрд╛рджрдХрддрд╛


рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдкреНрд░рджрд░реНрд╢рди рд▓рд┐рдЦрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмрдирд╛рдпрд╛ред рдлрд╛рдЗрд▓реЗрдВ:
example.php:
<?php class Example { public function run() { for($i = 0; $i < 10000000; $i++); } } 

testWithTicksSpeed.php:
 <?php declare(ticks = 1); require_once __DIR__ . '/Example.php'; $example = new Example(); $example->run(); 

testWithoutTicksSpeed.php:
 <?php require_once __DIR__ . '/Example.php'; $example = new Example(); $example->run(); 

рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЖрджрд┐ рдирд╣реАрдВ рд╣реИред рдЬрд┐рд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдШреЛрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЯрд┐рдХ = 1) рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо:
 mougrim@mougrim-pc:pcntls-signals$ time php testWithTicksSpeed.php complete, process time: 11 real 0m10.186s user 0m4.448s sys 0m5.732s mougrim@mougrim-pc:pcntls-signals$ time php testWithoutTicksSpeed.php complete, process time: 2 real 0m1.515s user 0m1.504s sys 0m0.008s 

рдЕрдВрддрд░ ~ 6.7 рдЧреБрдирд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЕрдВрддрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рд╕рдордп рдХреЛ рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдП (рд╣рдореЗрд╢рд╛ рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд╣реЗрдВ), рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рди, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 class Test_Signal { //    public function declareTicks() { echo "declare ticks\n"; declare(ticks = 1); } public function run() { //    pcntl_signal //     } } $test = new Test_Signal(); $test->run(); 

рдпрд╣ рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
 class Test_Signal { public function run() { $this->declareTicks(); //    pcntl_signal //     } public function declareTicks() { echo "declare ticks\n"; declare(ticks = 1); } } $test = new Test_Signal(); $test->run(); 

рдпрд╛рдиреА рдпрджрд┐ рдбрд┐рдХреНрд▓реЗрдпрд░ рдХреЛрдб рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджреБрднрд╛рд╖рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреЛрдб рдФрд░ рдУрдкреА-рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдпрд╛ред
рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдЧ рдореЗрдВ, рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 declare(ticks = 1); require_once __DIR__ . '/Example.php'; $example = new Example(); $example->run(); 

рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдЧ рдореЗрдВ, рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 require_once __DIR__ . '/Example.php'; declare(ticks = 1); $example = new Example(); $example->run(); 


рдмреНрдпреЛрд░рд╛


рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЕрдЬреАрдм рдЪреАрдЬреЛрдВ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдбреЗрдореЙрди рдиреЗ рдПрдХ рд╣реА рд╕рдВрдХреЗрдд рдХреЛ рдХрдИ рдмрд╛рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рди рд╣реЛред рдЬрдм рдПрдХ рдмрд╛рд░ SIGTERM рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдорди рдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдЬрд╛рдирдХрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рджреМрд░рд╛рди рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдбрд┐рдХреНрд▓реЗрдпрд░ (рдЯрд┐рдХреНрд╕ = 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдзреНрд╡рдЬ рд▓рдЧрд╛рдП, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ C / C ++ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд Mougrim_Pcntl_SignalHandler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдФрд░ рдЬреЛ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрдм рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдИ рдереАред

PHP 5.3 рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


PHP 5.3 рдиреЗ рдЕрджреНрднреБрдд pcntl_signal_dispatch () рдлрд╝рдВрдХреНрд╢рди рдкреЗрд╢ рдХрд┐рдпрд╛ред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдбрд┐рдХреНрд▓реЗрдпрд░ (рдЯрд┐рдХ = 1) рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рдЧреНрдирд▓ рдХрддрд╛рд░ рдореЗрдВ рдЬрдорд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдк pcntl_signal_dispatch () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдЪрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╣реА рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдХрдИ рдмрд╛рд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреА рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ pcntl_signal_dispatch () рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рдиред

SignalHandler


5.2 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдлрд╝рд╛рдЗрд▓ src / lt5.3 / Mougrim / Pcntl / SignalHandler.php:
 <?php declare(ticks = 1); /** * @author Mougrim <rinat@mougrim.ru> */ class Mougrim_Pcntl_SignalHandler { /** * @var callable[] */ private $handlers = array(); private $toDispatch = array(); /** *    * * @param int $signalNumber  ,  SIGTERM * @param callable $handler -  $signalNumber * @param bool $isAdd  true,     */ public function addHandler($signalNumber, $handler, $isAdd = true) { $isHandlerNotAttached = empty($this->handlers[$signalNumber]); if($isAdd) $this->handlers[$signalNumber][] = $handler; else $this->handlers[$signalNumber] = array($handler); if($isHandlerNotAttached && function_exists('pcntl_signal')) { $this->toDispatch[$signalNumber] = false; pcntl_signal($signalNumber, array($this, 'handleSignal')); } } /** *    */ public function dispatch() { foreach($this->toDispatch as $signalNumber => $isNeedDispatch) { if(!$isNeedDispatch) continue; $this->toDispatch[$signalNumber] = false; foreach($this->handlers[$signalNumber] as $handler) call_user_func($handler, $signalNumber); } } /** *      * * @param int $signalNumber  ,  SIGTERM */ public function handleSignal($signalNumber) { $this->toDispatch[$signalNumber] = true; } } 

рд╣реИрдВрдбрд▓рд░ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:
1) рдпрд╣ pcntl_signal_dispatch () рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ;
2) рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рдХрдИ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

5.3 рдФрд░ рдЙрдЪреНрдЪрддрд░, рдлрд╝рд╛рдЗрд▓ src / gte5.3 / Mougrim / Pcntl / SignalHandler.php рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 <?php namespace Mougrim\Pcntl; /** * @package Mougrim\Pcntl * @author Mougrim <rinat@mougrim.ru> */ class SignalHandler { /** * @var callable[] */ private $handlers = array(); private $toDispatch = array(); /** *    * * @param int $signalNumber  ,  SIGTERM * @param callable $handler -  $signalNumber * @param bool $isAdd  true,     */ public function addHandler($signalNumber, $handler, $isAdd = true) { $isHandlerNotAttached = empty($this->handlers[$signalNumber]); if($isAdd) $this->handlers[$signalNumber][] = $handler; else $this->handlers[$signalNumber] = array($handler); if($isHandlerNotAttached && function_exists('pcntl_signal')) { $this->toDispatch[$signalNumber] = false; pcntl_signal($signalNumber, array($this, 'handleSignal')); } } /** *    */ public function dispatch() { pcntl_signal_dispatch(); foreach($this->toDispatch as $signalNumber => $isNeedDispatch) { if(!$isNeedDispatch) continue; $this->toDispatch[$signalNumber] = false; foreach($this->handlers[$signalNumber] as $handler) call_user_func($handler, $signalNumber); } } /** *      * * @param int $signalNumber  ,  SIGTERM */ private function handleSignal($signalNumber) { $this->toDispatch[$signalNumber] = true; } } 

рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Mougrim_Pcntl_SignalHandler рд╡рд░реНрдЧ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЕрдВрдд рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдлрд╛рдЗрд▓реЗрдВ:
signalExampleRun.php:
 <?php //    SignalHandler,     declare(ticks = 1); require_once dirname(__FILE__) . "/src/lt5.3/Mougrim/Pcntl/SignalHandler.php"; require_once dirname(__FILE__) . "/SignalExample.php";; $signalHandler = new Mougrim_Pcntl_SignalHandler(); $signalExample = new SignalExample($signalHandler); $signalExample->run(); 

SignalExample.php:
 <?php class SignalExample { private $signalHandler; public function __construct(Mougrim_Pcntl_SignalHandler $signalHandler) { $this->signalHandler = $signalHandler; } public function run() { //    SIGTERM $this->signalHandler->addHandler(SIGTERM, array($this, 'terminate')); //    SIGINT $this->signalHandler->addHandler(SIGINT, array($this, 'terminate')); while(true) { $this->signalHandler->dispatch(); //   echo " \n"; usleep(300000); } } public function terminate() { //  SIGTERM  // ... echo "terminate\n"; exit(0); } } 

5.3 рдФрд░ рдКрдкрд░ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ src / gte5.3 / Mougrim / Pcntl / SignalHandler.php рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рд╡рд░реНрдЧ \ Mougrim \ Pcntl \ Signal_andler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


1) рдпрджрд┐ рдЖрдк PHP 5.3 рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдШреЛрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг (рдЯрд┐рдХ = 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ;
2) рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ (рдЯрд┐рдХ = 1); рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдШреЛрд╖рд┐рдд рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ "рд▓реЛрдб" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЯрд┐рдХ = 1);
3) рдпрджрд┐ рдЖрдк PHP 5.2 рдореЗрдВ Mougrim_Pcntl_SignalHandler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реВрдк рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕ рдпрд╛ рдХреЛрдб рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╕рд┐рдЧреНрдирд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
4) рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдХреНрд▓реЗрдпрд░ (рдЯрд┐рдХреНрд╕ = 1) рдХреЗ рд╕рд╛рде, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╣реИред

рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, \ _ Mougrim \ Pcntl \ SignalHandler рдФрд░ Mougrim_Pcntl_SignalHandler рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЬреАрдердм рдкрд░ рд╣реИрдВред

* UPDред * рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ, PsychodelEKS рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм pcntl_signal_dispatch () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рддрд╣рдд рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (), рддреЛ рд░рдирд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЯреАред .Kред рдЦреБрдж рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ \ Mougrim \ Pcntl \ SignalHandler рд╡рд░реНрдЧ рдХреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдП, рдЬреИрд╕рд╛ рдХрд┐ Mougrim_Pcntl_SignalHandler рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

* UPD2ред * рдлрд┐рдХреНрд╕реНрдб рдмрдЧреНрд╕, рдФрд░ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднреА \ Mougrim \ Pcntl \ SignalHandler рд╡рд░реНрдЧ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ pcntl_signal () рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╣реЛ (рдРрд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реИрдВрдбрд▓рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред

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


All Articles