PHP рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓рд╛рдЗрд╡ рдЕрдХрд╛рдЙрдВрдЯ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдирд╛

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

рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рд╕реЗрдЯрдЕрдк


рд╣рдо рд╢рд╛рдлрд╝реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ PHP рдХреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрдкреЛрдЬрд╝рд░ рдмрдирд╛рдПрдБред рдЬреЛ рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдСрдЯреЛрд▓реЙрдб рджреЛрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЖрдЧреЗ рд▓рд┐рдЦреЗрдВрдЧреЗ:
{ "require": { "cboden/Ratchet": "0.2.*" }, "autoload": { "psr-0": { "LiveScores": "src" } } } 

рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдБ:
 [root] bin src LiveScores public assets css vendor js vendor vendor 

рдЖрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕рдм рдХреБрдЫ рд▓реЗрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЖрд╡рд╢реНрдпрдХ рд╕реАрдПрд╕рдПрд╕, рдЬреЗрдПрд╕ рдФрд░ рдЫрд╡рд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рд╕рднреА рдХреЛрдб рднреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдиреБрдЕрд▓ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░, рддреЛ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рд╕рдВрдкрддреНрддрд┐ / * / рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, php рдХрдВрдкреЛрдЬрд╝рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдЕрдкрдбреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрдкреЛрдЬрд╝рд░ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ curl -sS getcomposer.org/installer рдЪрд▓рд╛рдХрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ php ред
рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред рдмрд╛рдж рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд▓ рд░рд╣реЗ рдЧреЗрдо рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рдВрджреЗрд╢ рджрд▓рд╛рд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ:
 // src/LiveScores/Scores.php <?php namespace LiveScores; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Scores implements MessageComponentInterface { private $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); } public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { // The sender is not the receiver, send to each client connected $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); } public function onError(ConnectionInterface $conn, \Exception $e) { $conn->close(); } } 

рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдРрд╕рд╛ рдбреЗрдореЙрди рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рддреБрд░рдВрдд рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛред рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 // bin/server.php <?php use Ratchet\Server\IoServer; use Ratchet\WebSocket\WsServer; use LiveScores\Scores; require dirname(__DIR__) . '/vendor/autoload.php'; $server = IoServer::factory( new WsServer( new Scores() ) , 8080 ); $server->run(); 

рдпрд╣ рд╕рдм рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЬрд░реВрд░рдд рд╣реИред WsServer - рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ IoServer рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо 8080 рдХреЛ рдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗред рдЖрдк рдХрд┐рд╕реА рднреА рдкреЛрд░реНрдЯ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреНрд░рд╛рдВрдбрдореЙрдпрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИред

рд░рд╛рдЬреНрдп рдмрдирд╛рдП рд░рдЦрдирд╛


рд╣рдо рдЦреЗрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВрдЧреЗ, рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЧреЗрдо рдореЗрдВ рдЦрд╛рддреЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдВрдЧреЗ, рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рднреА рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЛ рднреЗрдЬреЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЬреБрдбрд╝рдирд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЦреЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА)ред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдбреЗрдореЙрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ:
 // src/LiveScores/Fixtures.php <?php namespace LiveScores; class Fixtures { public static function random() { $teams = array("Arsenal", "Aston Villa", "Cardiff", "Chelsea", "Crystal Palace", "Everton", "Fulham", "Hull", "Liverpool", "Man City", "Man Utd", "Newcastle", "Norwich", "Southampton", "Stoke", "Sunderland", "Swansea", "Tottenham", "West Brom", "West Ham"); shuffle($teams); for ($i = 0; $i <= count($teams); $i++) { $id = uniqid(); $games[$id] = array( 'id' => $id, 'home' => array( 'team' => array_pop($teams), 'score' => 0, ), 'away' => array( 'team' => array_pop($teams), 'score' => 0, ), ); } return $games; } } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕ рдЦреЗрд▓ рдореЗрдВ рдШрдЯрдирд╛ рд╣реБрдИ рд╣реИред рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ рд╕реНрдХреЛрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП:
 // src/LiveScores/Scores.php public function __construct() { // Create a collection of clients $this->clients = new \SplObjectStorage; $this->games = Fixtures::random(); } 

рдЪреВрдВрдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рд╕рдордп рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрд╛рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЗрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рднреЗрдЬрдХрд░ рдПрдХ рдирдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИ, рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧреЗрдо рдФрд░ рдЙрдирдХреЗ рд╕реНрдХреЛрд░ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
рдпрд╣рд╛рдБ onOpen рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдпрд╣ рдХрд░рддрд╛ рд╣реИ:
 // src/LiveScores/Scores.php public function onOpen(ConnectionInterface $conn) { // Store the new connection to send messages to later $this->clients->attach($conn); // New connection, send it the current set of matches $conn->send(json_encode(array('type' => 'init', 'games' => $this->games))); echo "New connection! ({$conn->resourceId})\n"; } 

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕рдВрджреЗрд╢ рдХреЛ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдШрдЯрдирд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИред JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрд╛рдХрд┐ рд╣рдо рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХреЗрдВред

рдПрдЪрдЯреАрдПрдордПрд▓


рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдкреГрд╖реНрда рдХрд╛ рдПрдЪрдЯреАрдПрдордПрд▓-рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
 <div id="scoreboard"> <table> </table> </div> 

рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 <tr data-game-id="SOME-IDENTIFIER"> <td class="team home"> <h3>HOME TEAM NAME</h3> </td> <td class="score home"> <div id="counter-0-home"></div> </td> <td class="divider"> <p>:</p> </td> <td class="score away"> <div id="counter-0-away"></div> </td> <td class="team away"> <h3>AWAY TEAM NAME</h3> </td> </tr> 

рддрддреНрд╡реЛрдВ рдХреА рдЖрдИрдбреА рдХрд╛рдЙрдВрдЯрд░- * - * рд╣рдо рдЬреЗрдПрд╕ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ


рдЪрд▓реЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛред рдкрд╣рд▓реА рдЪреАрдЬ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рдирд╛ рд╣реИ:
 var conn = new WebSocket('ws://localhost:8080'); 

рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд░реНрд╡рд░ / рдбреЗрдорди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрд╕реНрдЯ рдПрдбреНрд░реЗрд╕ рдпрд╛ рдкреЛрд░реНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛:
 conn.onmessage = function(e) { 

рд╕рдВрджреЗрд╢ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдИ рдХреЗ рдбреЗрдЯрд╛ рдЧреБрдг рдореЗрдВ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо JSON рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
 var message = $.parseJSON(e.data); 

рдЕрдм рд╣рдо рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 switch (message.type) { case 'init': setupScoreboard(message); break; case 'goal': goal(message); break; } 

SetupScoreboard рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
 function setupScoreboard(message) { // Create a global reference to the list of games games = message.games; var template = '<tr data-game-id="{{ game.id }}"><td class="team home"><h3>{{game.home.team}}</h3></td><td class="score home"><div id="counter-{{game.id}}-home" class="flip-counter"></div></td><td class="divider"><p>:</p></td><td class="score away"><div id="counter-{{game.id}}-away" class="flip-counter"></div></td><td class="team away"><h3>{{game.away.team}}</h3></td></tr>'; $.each(games, function(id){ var game = games[id]; $('#scoreboard table').append(Mustache.render(template, {game:game} )); game.counter_home = new flipCounter("counter-"+id+"-home", {value: game.home.score, auto: false}); game.counter_away = new flipCounter("counter-"+id+"-away", {value: game.away.score, auto: false}); }); } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдмрд╕ рдЧреЗрдо рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рд░рди" рдХрд░рддреЗ рд╣реИрдВ, рдореВрдВрдЫреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирдИ рд▓рд╛рдЗрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрдЯреЗрдб рдХрд╛рдЙрдВрдЯрд░ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЧреЗрдо рд╕рд░рдгреА рдЧреЗрдо рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧреА, рддрд╛рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХреЗрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдЖрддрд╛ рд╣реИред рд╣рдо рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
 { type: 'goal', game: 'UNIQUE-ID', team: 'home' } 

рдЦреЗрд▓ рд╕рдВрдкрддреНрддрд┐ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рд╣реИ, рдЯреАрдо рдпрд╛ рддреЛ "рдШрд░" рдпрд╛ "рджреВрд░" рд╣реИред рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЧреЗрдо рдРрд░реЗ рдореЗрдВ рд╕реНрдХреЛрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЬрд┐рд╕ рдХрд╛рдЙрдВрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
 function goal(message) { games[message.game][message.team]['score']++; var counter = games[message.game]['counter_'+message.team]; counter.incrementTo(games[message.game][message.team]['score']); } 

рдЕрдм, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ:
 php bin/server.php 

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


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ JS, HTML рдФрд░ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЗрд╡ рдЕрдХрд╛рдЙрдВрдЯ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рддреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдореЛ ред


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


All Articles