рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░
рдПрдХ рд▓реЗрдЦ рд╣реИ ред рд▓реЗрдХрд┐рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреБрд░рд╛рдиреЗ рд▓реЗрдЦ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдирдП рдХрд╛ рдЕрдзреНрдпрдпрди рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╢реБрд░реБрдЖрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рддрд╛рдЬрд╛ рдореЗрдореЛрд░реА рд╕реЗ рдореИрдВ рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рд╕реНрдерд╛рдкрдирд╛
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдерд╛рдкрдирд╛
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░
рд╡рд░реНрдгрд┐рдд рд╣реИ ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА PHP рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬреЛ 5.3 рд╕реЗ рдХрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдмрд╛рдХреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ FreeBSD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):
- рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рд╕реЗ PHP рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- PHP5-pcntl
- PHP5-shmop
- PHP5-рд╕реЙрдХреЗрдЯ
рдпрд╛ рддреЛ php5- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
PCNTL, SHMOP рдФрд░ SOCKETS рдХреЗ рд╕рд╛рдордиреЗ рд╕реНрдерд┐рдд рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ php5- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЛрд░реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- Pecl-eio рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
- Pecl- рдИрд╡реЗрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ:
- рдпрджрд┐ рдЧрд┐рдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЖрдк рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ):
- рд╕рд╛рдЗрдЯ рдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ phpDaemon рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕реНрдерд╛рдкрдирд╛ рдЕрдм рдкреВрд░реА рд╣реЛ рдЪреБрдХреА рд╣реИред рдЕрдм рдпрд╣ рдкрд╣рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рдЯ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ - 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 {}
рдЕрдм рд╣рдо рдЕрдкрдирд╛ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд▓реЙрдЧ (/var/log/phpdaemon.log) рдореЗрдВ рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
M
рд╣рдо рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ
рдореИрдВ рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг WebSocket рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдирдП рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╣ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рд╕рдордп рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЖрдк рд╣рдореЗрд╢рд╛ рдмреНрдпрд╛рдЬ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рд╡рд░реНрдЧ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдпрд╣ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ: рдХреЛрдб рд╕рд╣рдЬ рд╣реИред
рддреЛ:
- рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде MyWebSocket.php рдирд╛рдо рдХреЗ PHPDaemon / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
<?php namespace PHPDaemon\Applications; class MyWebSocket extends \PHPDaemon\Core\AppInstance { public $enableRPC=true;
- рд╣рдорд╛рд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдореНрди рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
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 {}
- рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ 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>
- рдбреЗрдореЙрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛:
- рд╣рдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдкрдиреА HTML рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдУрдкреЗрд░рд╛ 12.13 рдФрд░ Google рдХреНрд░реЛрдо 24.0.1312.57 рдореЗрдВ рдЬрд╛рдБрдЪ рдХреА рдереА)ред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬреЗрдПрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреА рд╕рднреА рдмрд╛рддрдЪреАрдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреАред
рдЯрд┐рдкреНрдкрдгреА
рд╕рд░реНрд╡рд░ рдореЗрдВ рджреЛ рдорд┐рдирдЯ (120 рд╕реЗрдХрдВрдб) рдХрд╛ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдбрдореА рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рди рд▓рдЧреЗ рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рди рд╣реЛред рдФрд░ site.com рдХреЛ рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ рдПрдбреНрд░реЗрд╕ рд╕реЗ рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВред
рдкреБрдирд╢реНрдЪ рд▓реЗрдЦ 19 рдлрд░рд╡рд░реА, 2014 рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг (1.0-beta3) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред