HTML рдлрд╝рд╛рдЗрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ: рд╕реНрдХрд╛рдИреЗрдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХ ReactPHP рдХрд╛ рдПрдХ рдЕрдзреНрдпрд╛рдп


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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдореЗрдВ рд╣рдо рдХреНрдпрд╛ рд░реБрдХреЗ рдереЗред

рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕рд░рд▓ HTTP рд╕рд░реНрд╡рд░ рдХреЛ PHP рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп index.php рдлрд╝рд╛рдЗрд▓ рд╣реИ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреА рд╣реИред рдпрд╣рд╛рдВ рдЙрдЪреНрдЪрддрдо-рд╕реНрддрд░реАрдп рдХреЛрдб рд╣реИ: рд╣рдо рдПрдХ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдмрдирд╛рддреЗ рд╣реИрдВ, HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓реВрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


 use React\Http\Server; use Psr\Http\Message\ServerRequestInterface; $loop = React\EventLoop\Factory::create(); $router = new Router(); $router->load('routes.php'); $server = new Server( function (ServerRequestInterface $request) use ($router) { return $router($request); } ); $socket = new React\Socket\Server(8080, $loop); $server->listen($socket); $loop->run(); 

рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдПрдХ рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 // src/Router.php use Psr\Http\Message\ServerRequestInterface; use React\Http\Response; class Router { private $routes = []; public function __invoke(ServerRequestInterface $request) { $path = $request->getUri()->getPath(); echo "Request for: $path\n"; $handler = $this->routes[$path] ?? $this->notFound($path); return $handler($request); } public function load($filename) { $routes = require $filename; foreach ($routes as $path => $handler) { $this->add($path, $handler); } } public function add($path, callable $handler) { $this->routes[$path] = $handler; } private function notFound($path) { return function () use ($path) { return new Response( 404, ['Content-Type' => 'text/html; charset=UTF-8'], "No request handler found for $path" ); }; } } 

рд░реВрдЯреНрд╕ рд╕реЗред routes.php рдлрд╝рд╛рдЗрд▓ рдХреЛ routes.php рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рджреЛ рдорд╛рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рд╣реИ:


 use React\Http\Response; use Psr\Http\Message\ServerRequestInterface; return [ '/' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Main page' ); }, '/upload' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Upload page' ); }, ]; 

рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред


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


рддреЛ, рд╣рдо рдЗрд╕ HTML рдХреЛ рдХрд╣рд╛рдБ рд░рдЦрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ, рдЖрдк рд╡реЗрдм рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реВрдЯ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 // routes.php return [ '/' => function (ServerRequestInterface $request) { $html = <<<HTML <!DOCTYPE html> <html lang=тАЭenтАЭ> <head> <meta charset=тАЭUTF-8тАЭ> <title>ReactPHP App</title> </head> <body> Hello, world </body> </html> HTML; return new Response( 200, ['Content-Type' => 'text/html'], $html ); }, '/upload' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Upload page' ); }, ]; 

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдордд рдХрд░реЛ! рдЖрдк рдкреНрд░рд╕реНрддреБрддрд┐ (HTML рдкреГрд╖реНрда) рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ (рд░реВрдЯрд┐рдВрдЧ) рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпреЛрдВ? рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ HTML рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЯрди рдХрд╛ рд░рдВрдЧред рдФрд░ рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛? router.php рд╕рд╛рде рдлрд╛рдЗрд▓ рдХрд░реЗрдВред рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдмрдЯрди рдХрд╛ рд░рдВрдЧ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдЯрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ ...


рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдХреЗрд▓реЗ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ HTML рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВрдЧреЗред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ, рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕реЗ рдкреГрд╖реНрда рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо index.html рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдкреГрд╖реНрда рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИрдВ:


 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ReactPHP App</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" > </head> <body> <div class="container"> <div class="row"> <form action="/upload" method="POST" class="justify-content-center"> <div class="form-group"> <label for="text">Text</label> <textarea name="text" id="text" class="form-control"> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> </div> </div> </body> </html> 

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


рдлрд╛рдЗрд▓реЗрдВ рдкрдврд╝рдирд╛ред рдХреИрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ


рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:


 // routes.php return [ '/' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/html'], file_get_contents('pages/index.html') ); }, // ... ]; 

рдФрд░ рд╡реИрд╕реЗ, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреГрд╖реНрда http://127.0.0.1:8080/ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВред



рддреЛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ? рдФрд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдзреАрдорд╛ рд╣реЛрдиреЗ рд▓рдЧреЗ рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛрдВрдЧреАред


рдмреНрд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЙрд▓


рдореБрдЭреЗ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ "рдмреНрд▓реЙрдХрд┐рдВрдЧ" рдХреЙрд▓ рд╕реЗ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛрдб рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, sleep() рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ sleep() рдлрд╝рдВрдХреНрд╢рди:


 // routes.php return [ '/' => function (ServerRequestInterface $request) { sleep(10); return new Response( 200, ['Content-Type' => 'text/html'], file_get_contents('pages/index.html') ); }, '/upload' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Upload page' ); }, ]; 

рдпрд╣ HTML рдкреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ 10 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлреНрд░реАрдЬ рдХрд░ рджреЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ /upload рдкрддреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ рд╣реИред sleep(10) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдореИрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реБрджреНрдз рдСрдкрд░реЗрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реВрдВред


рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреГрд╖реНрда / рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ 10 рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ HTML рдкреГрд╖реНрда рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╣рдо /upload рдкрддрд╛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рддреБрд░рдВрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ 'рдЕрдкрд▓реЛрдб рдкреЗрдЬ' рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред рдЕрдм, рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВред рдкрддрд╛ рдмрд╛рд░ рдореЗрдВ, http://127.0.0.1:8080/upload рджрд░реНрдЬ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рддреБрд░рдВрдд рди рдЦреЛрд▓реЗрдВред рдЗрд╕ рдкрддреЗ рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред рдлрд┐рд░ рдкрд╣рд▓реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкреГрд╖реНрда http://127.0.0.1:8080/ рдЦреЛрд▓реЗрдВред рдЬрдмрдХрд┐ рдпрд╣ рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ 10 рд╕реЗрдХрдВрдб рд▓рдЧреЗрдВрдЧреЗ), рдЬрд▓реНрджреА рд╕реЗ рджреВрд╕рд░реА рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкрддрд╛ рдмрд╛рд░ рдореЗрдВ рдЫреЛрдбрд╝реЗ рдЧрдП рдкрддреЗ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдВрдЯрд░" рджрдмрд╛рдПрдВ ( http://127.0.0.1:8080/upload ) ред


рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛? рд╣рд╛рдБ, рдкрддрд╛ /, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рд▓реЛрдб рд╣реЛрдиреЗ рдореЗрдВ 10 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╛рди рд╕рдордп рд▓рдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ sleep() рдХреЙрд▓ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдРрд╕рд╛ рд╣реБрдЖ?


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


рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ file_get_contents('pages/index.h') рдХреЙрд▓рд┐рдВрдЧ рд╕реЗ рдХреНрдпрд╛ file_get_contents('pages/index.h') ? рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдиреНрдп рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЬреИрд╕реЗ рдореЗрдореЛрд░реА рдпрд╛ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмреЗрд╣рдж рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛ рдЧрдИ рд╣реИ, рдпрд╛ рдбрд┐рд╕реНрдХ рд╕реНрд╡рдпрдВ рдзреАрдореА рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВред


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


рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛рдж рд░рдЦреЗрдВ:


  • рдЖрдк рдХрднреА рднреА рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рддреЛ, рдлрд┐рд░ рд╣рдо рдлрд╛рдЗрд▓ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ? рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рджреВрд╕рд░реЗ рдирд┐рдпрдо рдкрд░ рдЖрддреЗ рд╣реИрдВ:


  • рдЬрдм рдПрдХ рдЕрд╡рд░реБрджреНрдз рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд╛рдВрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЪрд▓реЛ рд╕рд╣реА рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕рдорд╛рдзрд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред


рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛


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


composer require react/child-process


рд╡рд┐рдВрдбреЛрдЬ рд╕рдВрдЧрддрддрд╛


рд╡рд┐рдВрдбреЛрдЬ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, STDIN, STDOUT рдФрд░ STDERR рдереНрд░реЗрдбреНрд╕ рдмреНрд▓реЙрдХ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдШрдЯрдХ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкреНрд░реЛрд╕реЗрд╕ рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдШрдЯрдХ рд▓рд┐рдирдХреНрд╕ (рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓) рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЕрдм рд╣рдо рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рд╢реЗрд▓ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред routes.php рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ, рдФрд░ рдлрд┐рд░ / рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдмрджрд▓реЗрдВред React\ChildProcess\Process рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ, рдФрд░ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореМрдЬреВрджрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВ:


 // routes.php use Psr\Http\Message\ServerRequestInterface; use React\ChildProcess\Process; use React\Http\Response; return [ '/' => function (ServerRequestInterface $request) { $childProcess = new Process('ls'); return new Response( 200, ['Content-Type' => 'text/html'], file_get_contents('pages/index.html') ); }, // ... ]; 

рдлрд┐рд░ рд╣рдореЗрдВ start() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ start() рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди routes.php рдореЗрдВред routes.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИред рд╣рдо index.php . index.php рд╕реЗ рд╕реАрдзреЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рд░реНрдЧреЛрдВ рдкрд░ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХреИрд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ "рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди" рд╣реИред


рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


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


 use Psr\Http\Message\ServerRequestInterface; use React\EventLoop\LoopInterface; use React\Http\Response; class Router { private $routes = []; /** * @var LoopInterface */ private $loop; public function __construct(LoopInterface $loop) { $this->loop = $loop; } // ... } 

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЛ рдирд┐рдЬреА $loop рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИ рдЬрдм рд╣рдо рд╡рд░реНрдЧ рдХреЛ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдирдпрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд░рд╛рдЙрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред index.php рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЙрд╕ рд░реЗрдЦрд╛ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╣рдо Router рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:


 // index.php $loop = React\EventLoop\Factory::create(); $router = new Router($loop); $router->load('routes.php'); 

рд╣реЛ рдЧрдпрд╛ред routes.php рд╡рд╛рдкрд╕ рдЬрд╛рдПрдБред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХреНрд╡реЗрд░реА рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХреЙрд▓рдмреИрдХ рдмрджрд▓реЗрдВ рдФрд░ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ: рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ LoopInterface рд▓рд╛рдЧреВ LoopInterface :


 // routes.php use Psr\Http\Message\ServerRequestInterface; use React\EventLoop\LoopInterface; use React\ChildProcess\Process; use React\Http\Response; return [ '/' => function (ServerRequestInterface $request, LoopInterface $loop) { $childProcess = new Process('ls'); $childProcess->start($loop); return new Response( 200, ['Content-Type' => 'text/html'], file_get_contents('pages/index.html') ); }, '/upload' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Upload page' ); }, ]; 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдХреА start() рд╡рд┐рдзрд┐ рдореЗрдВ рд▓реВрдк рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХрд╣рд╛рдВ рдорд┐рд▓рддрд╛ рд╣реИ? рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд╛рдЙрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдирд┐рдЬреА $loop рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХрд╣реЗ рдЬрд╛рдиреЗ рдкрд░ рд╣рдореЗрдВ рдмрд╕ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


__invoke() Router рдХреНрд▓рд╛рд╕ рдЦреЛрд▓реЗрдВ рдФрд░ __invoke() рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдХреЙрд▓ рдореЗрдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП:


 public function __invoke(ServerRequestInterface $request) { $path = $request->getUri()->getPath(); echo "Request for: $path\n"; $handler = $this->routes[$path] ?? $this->notFound($path); return $handler($request, $this->loop); } 

рд╡рд╣ рд╕рдм рд╣реИ! рдпрд╣ рд╢рд╛рдпрдж рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИ ред рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЪрдХреНрд░ рдХреА рдПрдХ рдмрдбрд╝реА рдпрд╛рддреНрд░рд╛ рд╣реБрдИ, рд╣реИ рдирд╛? index.php рдлрд╝рд╛рдЗрд▓ рд╕реЗ Router рд╡рд░реНрдЧ рддрдХ, рдФрд░ рдлрд┐рд░ Router рд╡рд░реНрдЧ рд╕реЗ routes.php ред рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рд╕рд╣реА рд╕реЗ рдлрд╝рд╛рдЗрд▓ рджрд░реНрдЬ рдХрд░реЗрдВред


рддреЛ, рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдЬрд╛рджреВ рдХреЛ рдХрд░реЗрдЧреА, рдЪрд▓реЛ рд╕рд░рд▓ ls рдХреЛ рднрд╛рд░реА ping 8.8.8.8 рд╕рд╛рде рдмрджрд▓реЗрдВред рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджреЛ рдкреГрд╖реНрда рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, http://127.0.0.1:8080/ , рдФрд░ рдлрд┐рд░ /upload ред рджреЛрдиреЛрдВ рдкреГрд╖реНрда рдЬрд▓реНрджреА рд╕реЗ рдЦреБрд▓рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рджреЗрд░реА рдХреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ ping рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдорд╣рдВрдЧреЗ рдСрдкрд░реЗрд╢рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ) рдХреЛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдВрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рдВрдзреЗрдВ


рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ, рдЗрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд╛рдВрдЯреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред


рд╣рдо рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рдирд┐рдВрдЧ ls рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреИрд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрддреНрддрд░ рд╢рд░реАрд░ рдХреЛ рднреЗрдЬреЗрдВ? рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рд╣реИ: рд╕реВрддреНрд░ред


рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рд╢реЗрд▓ рдХрдорд╛рдВрдб рдореЗрдВ рддреАрди рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╣реИрдВ: STDIN, STDOUT рдФрд░ STDERRред рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд▓рд╕ рд╕реНрдЯреНрд░реАрдоред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо ls рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реАрдзреЗ STDOUT (рдЯрд░реНрдорд┐рдирд▓ рд╕реНрдХреНрд░реАрди рдкрд░) рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рддрдХ рдкрд╣реБрдВрдЪ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рдпрд╣ рдирд╛рд╢рдкрд╛рддреА рдХреЗ рдирд╛рд╢рдкрд╛рддреА рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдореЗрдВ, file_get_contents() рдХреЙрд▓ рдХреЛ $childProcess->stdout :


 return new Response( 200, ['Content-Type' => 'text/plain'], $childProcess->stdout ); 

рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рддреАрди рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ stdio рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ: stdout , stdin рдФрд░ stderr ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред Response рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред Response рдХреНрд▓рд╛рд╕ рдХрд╛рдлреА рд╕реНрдорд╛рд░реНрдЯ рд╣реИ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрд╕рдиреЗ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХреА рдФрд░ рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреАред


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреЗрдЬ http://127.0.0.1:8080/ рдЦреЛрд▓реЗрдВ: рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА http://127.0.0.1:8080/ рдЪрд╛рд╣рд┐рдПред



рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреБрдЫ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдХреЗ рд╕рд╛рде ls рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рд╣рдордиреЗ рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЛ file_get_contents() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pages/index.html рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдЕрдм, рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдЗрд╕ рдЪрд┐рдВрддрд╛ рдХреЗ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджреЗрдЧрд╛ред ls рдХреЛ cat pages/index.html рдмрджрд▓реЗрдВред


рдпрджрд┐ рдЖрдк cat рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрддрд░, рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред cat pages/index.html рдХрдорд╛рдВрдб cat pages/index.html рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ STDOUT рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ stdout рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдВ routes.php рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИред routes.php рдлрд╛рдЗрд▓:


 // routes.php use Psr\Http\Message\ServerRequestInterface; use React\EventLoop\LoopInterface; use React\ChildProcess\Process; use React\Http\Response; return [ '/' => function (ServerRequestInterface $request, LoopInterface $loop) { $childProcess = new Process('cat pages/index.html'); $childProcess->start($loop); return new Response( 200, ['Content-Type' => 'text/html'], $childProcess->stdout ); }, '/upload' => function (ServerRequestInterface $request) { return new Response( 200, ['Content-Type' => 'text/plain'], 'Upload page' ); }, ]; 

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


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


рд╣рд╛рдмрд░рд╛ рдкрд╛рдардХ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдбрд┐рд╕реНрдХрд╛рдЙрдВрдЯ рдореЗрдВ рдкреВрд░реА рдХрд┐рддрд╛рдм рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВред


рдФрд░ рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╣рдореЗрд╢рд╛ рд╢рд╛рдВрдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ ! рдЖрдУ, рд╣рдо рдордЬреЗ рдХрд░рддреЗ рд╣реИрдВ!

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


All Articles