рд╣рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ PHP рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рднрд╛рдЧ 2. рдЖрдИрдкреАрд╕реА

рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ PHP рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рд╡рд┐рд╖рдп рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреА рдХреБрдЫ рд░реБрдЪрд┐ рд╣реИред

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:


рдФрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдбреЗрдореЛ рдЪреИрдЯ рдХрд╛ рд▓рд┐рдВрдХред

рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЪрд▓рд╛рдирд╛


рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ 1024 рдПрдХ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реАрдорд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдВ), рд╕рд╛рде рд╣реА рдкреВрд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рдХреЛрд░), рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - (рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ = рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛)ред

рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо pcntl_fork() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдмрдЪреНрдЪрд╛) рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕ рдХреЙрд▓ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реИред
pcntl_fork() рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж pcntl_fork() рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢рд╛рдЦрд╛рдПрдБ: рдпрджрд┐ pcntl_fork() рдлрд╝рдВрдХреНрд╢рди pcntl_fork() рдпрд╣ рдмрдЪреНрдЪреЗ рдХреА PID рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ NULL рдХреЛ рдмрдЪреНрдЪреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрд╛рдВрдЯрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдлрд▓ рд░рд╣рд╛, рддреЛ pcntl_fork() рдлрд╝рдВрдХреНрд╢рди -1)ред

 $pid = pcntl_fork(); //  //        if ($pid == -1) { //      } elseif ($pid) { //      } else { //      ,  PID      getmypid() } 


рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдЬрд┐рддрдиреА рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрддрдиреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 $childs = array(); for ($i=0; $i<4; $i++) { $pid = pcntl_fork(); //  if ($pid == -1) { die("error: pcntl_fork"); } elseif ($pid) { //  $childs[] = $pid; //   PID,     :) } else { //  break; //  ,        } } 


рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░


рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН рд╕рдВрдмрдВрдзрд┐рдд рд╕реЙрдХреЗрдЯ:
stream_socket_pair() рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдмрдВрдзрд┐рдд рдЕрдкреНрд░рднреЗрджреНрдп рд╕реНрдЯреНрд░реАрдо рд╕реЙрдХреЗрдЯ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

 $pair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); //     fwrite($pair[0], ''); //    fread($pair[1], mb_strlen('')); //   


рдЕрдм рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╛рдВрдЯреЗ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 $pair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); //   $pid = pcntl_fork(); //  //        if ($pid == -1) { die("error: pcntl_fork"); } elseif ($pid) { //  fclose($pair[0]); //      $child = $pair[1]; //       } else { //  fclose($pair[1]); //      $parent = $pair[0]; //       } 


рдХрдИ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб:

 $parent = null; $childs = array(); for ($i=0; $i<5; $i++) { $pair = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); //   $pid = pcntl_fork(); //  if ($pid == -1) { die("error: pcntl_fork"); } elseif ($pid) { //  fclose($pair[0]); //      $childs[] = $pair[1]; //       } else { //  fclose($pair[1]); //      $parent = $pair[0]; //       break; //  ,        } } 

рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, $childs рд╕рд░рдгреА рдореЗрдВ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реЙрдХреЗрдЯ рд╣реЛрдВрдЧреЗ, рдФрд░ рдмрдЪреНрдЪреЗ $parent рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $parent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╕реНрд╡рд╛рдореА рдФрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреГрдердХреНрдХрд░рдг


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕реАрдзреЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдХреЗ рдкрдиреНрдиреЛрдВ рд╕реЗ рдпрд╛ рдореБрдХреБрдЯ рд╕реЗ рд▓рд┐рдкрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рд╕реБрдирдиреЗ рдХреЗ рд╕реЙрдХреЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 $service = stream_socket_server('unix:///tmp/websocket.sock', $errorNumber, $errorString); 


рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкреНрд░реЙрдХреНрд╕реА nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░


Nginx рд╕рдВрд╕реНрдХрд░рдг 1.3.13 рдХреЗ рдмрд╛рдж рд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред Nginx рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдорд╛рди рдкреЛрд░реНрдЯ рдкрд░ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдЖрдИрдкреА рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдмрдиреНрд╕ рд╕реЗ рдЦреБрд▓реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг nginx config рдЬреЛ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
 limit_conn_zone $binary_remote_addr zone=perip:10m; server { listen 5.135.163.218:80; server_name sharoid.ru; location / { limit_conn perip 5; #  5   1 ip proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; #    } } 


рдХрдВрд╕реЛрд▓ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ


php websocket.php рдпрд╛ ./websocket.php php websocket.php (рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж)
рдпрджрд┐ рдЖрдк nohup рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, nohup ./websocket.php & , рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдВрд╕реЛрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рджреЛ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛, рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рд╢реНрд░рдорд┐рдХреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Yii рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЕрдкрдиреЗ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдорд╛рд╕реНрдЯрд░ рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЙрдХреЗрдЯ рдкрд░ рд╕реБрдирддрд╛ рд╣реИ (рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ unix:///tmp/websocket.sock рдерд╛ unix:///tmp/websocket.sock ), рд╣рдо рдЗрд╕ рд╕реЙрдХреЗрдЯ рдХреЛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдореЗрдВ рдХрд╣реАрдВ рднреА рдпрд╛ рдореБрдХреБрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рд╕реНрдЯрд░ рднреЗрдЬ рджреЗрдЧрд╛ рд╕рднреА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛, рдФрд░ рд╡реЗ, рдмрджрд▓реЗ рдореЗрдВ, рд╕рднреА рдЧреНрд░рд╛рд╣рдХ:
 $service = stream_socket_client ('unix:///tmp/websocket.sock', $errno, $errstr); fwrite($service, ' '); 

Yii рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 Yii::app()->websocket->send(' '); 

Yii рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ , рдЗрд╕реЗ extensions/websocket
components рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, Websocket.php, WebsocketMasterHandler.php рдФрд░ WebsocketWorkerHandler.php рдХреЛ рдирдореВрдирд╛ / yii рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдбрд╛рд▓реЗрдВред
commands рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдирдореВрдирд╛ / yii рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ WebsocketCommand.php рд╕реЗ рдбрд╛рд▓реЗрдВред
Main.php рдФрд░ рдХрдВрд╕реЛрд▓.php рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ, рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓реЗрдВ:
 'websocket' => array( 'class' => 'Websocket', //'websocket' => 'tcp://127.0.0.1:8000', //'localsocket' => 'tcp://127.0.0.1:8001',// unix:///tmp/mysock //'workers' => 1 ), 

рдХрдВрд╕реЛрд▓.рдлреИрдк рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рд╣рдо рдЗрдВрдкреЛрд░реНрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ рднреА рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:
 'ext.websocket.*' 



рдкреНрд░рджрд░реНрд╢рди


рдбреЗрдореЛ рдЪреИрдЯ 2.0 (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕реАрдорд╛, рдПрдХ рдЖрдИрдкреА рд╕реЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1 рд╕рдВрджреЗрд╢)
рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛, рд╕рд╛рде рд╣реА рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж рдкрд╣рдЪрд╛рдиреА рдЧрдИ рдХрдорд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рдерд╛ред
рдбреЗрдореЛ рдЪреИрдЯ 1.0 (рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА, рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ)

рдореИрдВрдиреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдФрд░ рдЬреАрдердм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛

рдЕрджреНрдпрддрди: рдпрджрд┐ рд╕рдореБрджрд╛рдп рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЦреЗрд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧреА рдПрдХ рд╣реА рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рд╣реЛрдВрдЧреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗ (рдбреЗрдореЛ рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИ)ред

рднрд╛рдЧ рддреАрди: рдЪреИрдЯ рд╕реЗ рдЧреЗрдо рддрдХ: рдмреИрдЯрд▓ рд╕рд┐рдЯреА

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


All Articles