рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд phpDaemon- рдЖрдзрд╛рд░рд┐рдд WebSocket рдХреЗ рд╕рд╛рде

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

рд╕реНрдерд╛рдкрдирд╛


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдерд╛рдкрдирд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PHP рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬреЛ 5.3 рд╕реЗ рдХрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдмрд╛рдХреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ FreeBSD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):
  1. рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рд╕реЗ PHP рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

    рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
    • PHP5-pcntl
      # cd /usr/ports/devel/php5-pcntl # make install clean 
    • PHP5-shmop
       # cd /usr/ports/devel/php5-shmop # make install clean 
    • PHP5-рд╕реЙрдХреЗрдЯ
       # cd /usr/ports/net/php5-sockets # make install clean 

    рдпрд╛ рддреЛ php5- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
     # cd /usr/ports/lang/php5-extensions # make config 

    PCNTL, SHMOP рдФрд░ SOCKETS рдХреЗ рд╕рд╛рдордиреЗ рд╕реНрдерд┐рдд рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
     # make install clean 

    рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ php5- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЛрд░реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  2. Pecl-eio рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
     # cd /usr/ports/devel/pecl-eio # make install clean 


  3. Pecl- рдИрд╡реЗрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ:
     # cd /usr/ports/devel/pecl-event # make install clean 


  4. рдпрджрд┐ рдЧрд┐рдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЖрдк рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ):
     # cd /usr/ports/devel/git # make install clean 


  5. рд╕рд╛рдЗрдЯ рдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ phpDaemon рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
     # cd /usr/local # git clone git://github.com/kakserpom/phpdaemon.git # chmod +x phpdaemon/bin/phpd # ln -s /usr/local/phpdaemon/bin/phpd /usr/bin/phpd 



рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдерд╛рдкрдирд╛ рдЕрдм рдкреВрд░реА рд╣реЛ рдЪреБрдХреА рд╣реИред рдЕрдм рдпрд╣ рдкрд╣рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рдЯ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ - ExampleWebSocketред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ /usr/local/phpdaemon/conf/phpd.conf рдореЗрдВ рд╣рдорд╛рд░реЗ WebSocket рд╕рд░реНрд╡рд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 user www; group www; max-workers 8; min-workers 1; start-workers 1; max-idle 0; Pool:Servers\WebSocket { enable 1; listen "tcp://0.0.0.0"; listen-port 8047; privileged; } ExampleWebSocket {} 



рдЕрдм рд╣рдо рдЕрдкрдирд╛ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
 # phpd start 


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд▓реЙрдЧ (/var/log/phpdaemon.log) рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
 M#7964 \PHPDaemon\Core\Pool:Servers\WebSocket up. M#7964 \PHPDaemon\Core\Pool:\PHPDaemon\Servers\WebSocket\Pool up. W#7966 \PHPDaemon\Examples\ExampleWebSocket up. Spawning 1 worker(s) W#7967 \PHPDaemon\Examples\ExampleWebSocket up. 


рд╣рдо рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ


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

рддреЛ:
  1. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде MyWebSocket.php рдирд╛рдо рдХреЗ PHPDaemon / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
     <?php namespace PHPDaemon\Applications; class MyWebSocket extends \PHPDaemon\Core\AppInstance { public $enableRPC=true; //         public $sessions=array(); //         //        public function onReady() { $appInstance = $this; //  timerTask()    5  $this->timerTask($appInstance); //       ws://site.com:8047/myws \PHPDaemon\Servers\WebSocket\Pool::getInstance()->addRoute('myws', function ($client) use ($appInstance) { $session=new MyWebSocketRoute($client, $appInstance); //   $session->id=uniqid(); //    ID $this->sessions[$session->id]=$session; //   return $session; }); } function timerTask($appInstance) { //      foreach($this->sessions as $id=>$session) { $session->client->sendFrame('This is private message to client with ID '.$id, 'STRING'); } //         ( ) $appInstance->broadcastCall('sendBcMessage', array(\PHPDaemon\Core\Daemon::$process->getPid())); //     5  \PHPDaemon\Core\Timer::add(function($event) use ($appInstance) { $this->timerTask($appInstance); $event->finish(); }, 5e6); //     } //     (     ) public function sendBcMessage($pid) { foreach($this->sessions as $id=>$session) { $session->client->sendFrame('This is broadcast message from worker #'.$pid, 'STRING'); } } } class MyWebSocketRoute extends \PHPDaemon\WebSocket\Route { public $client; public $appInstance; public $id; //   ID  public function __construct($client,$appInstance) { $this->client=$client; $this->appInstance=$appInstance; } //       public function onFrame($data, $type) { //    $this->client->sendFrame('Server receive from client #'.$this->id.' message "'.$data.'"', 'STRING'); } //        public function onFinish() { //     unset($this->appInstance->sessions[$this->id]); } } 

  2. рд╣рдорд╛рд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдореНрди рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
     user www; group www; max-workers 8; min-workers 1; start-workers 1; max-idle 0; Pool:Servers\WebSocket { enable 1; listen "tcp://0.0.0.0"; listen-port 8047; privileged; } MyWebSocket {} 

  3. рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ HTML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
     <script type="text/javascript"> function add(text) { document.forms[0].b.value=text+"\n"+document.forms[0].b.value; } if("WebSocket" in window) { var timer; var ws=new WebSocket("ws://site.com:8047/myws"); ws.onopen=function() { add('Connection opened'); timer=window.setInterval(function() { var date = new Date(); var message='ping at '+date.getSeconds(); ws.send(message); add('Client sent message "'+message+'"'); }, 30000); }; ws.onmessage=function(evt) { add('Message from server: "'+evt.data+'"'); }; ws.onclose=function() { add('Connection closed'); window.clearTimeout(timer); }; } else { alert("Your browser doesn't support WebSocket"); } </script> <form> <textarea name="b" style="width:100%;height:100%"/></textarea> </form> 

  4. рдбреЗрдореЙрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛:
     # phpd restart 

  5. рд╣рдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдкрдиреА HTML рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдУрдкреЗрд░рд╛ 12.13 рдФрд░ Google рдХреНрд░реЛрдо 24.0.1312.57 рдореЗрдВ рдЬрд╛рдБрдЪ рдХреА рдереА)ред


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

рдЯрд┐рдкреНрдкрдгреА


рд╕рд░реНрд╡рд░ рдореЗрдВ рджреЛ рдорд┐рдирдЯ (120 рд╕реЗрдХрдВрдб) рдХрд╛ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдбрдореА рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рди рд▓рдЧреЗ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рди рд╣реЛред рдФрд░ site.com рдХреЛ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдПрдбреНрд░реЗрд╕ рд╕реЗ рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВред

рдкреБрдирд╢реНрдЪ рд▓реЗрдЦ 19 рдлрд░рд╡рд░реА, 2014 рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг (1.0-beta3) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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


All Articles