
??? ??? ???? ???? ??? ??????? ?????? ???? ? ? ??? ?????. WebSockets ??? ???? ????? ?? ??? ?? ??? ??? ????, ??? ???? ?? ?? ???? ?? ?? ? ??? PHP? ?? WebSocket ??? ?????. ? ????? PHP? WebSocket? ???? ??? ??? ???? ??? ???? ???? ?? ??? ?????.
1. WebSocket??
WebSocket? ?? TCP ??? ?? ??? ??? ?? ???????. HTTP ????? ?? WebSocket ??? ??? ??? HTTP ?? ? ??? ?? ?? ??? ?? ?? ??? ????? ?? ?? ???? ??? ? ????. ?? ?? WebSocket? ?? ?? ??, ?? ???? ??? ??? ??? ? ??? ?? ???? ??? ?? ??? ??? ??? ??, ??? ? ?? ????? ?????.
2. PHP? WebSocket? ???? ??
PHP? Ratchet, Wrench ?? ?? WebSocket? ???? ?? ?? ?????? ?????? ?????. ??? ?????? ?????? PHP ?? Swoole? ???? ?????. Swoole? ??? IO, ??? ? ?? ??? ???? ??? ???? ?? ??????, ?? ???, ??? ? ??, ??? ???? ? ?????. ?? ? ?? ??????.
? ???? Ratchet ?????? ???? WebSocket? ???????. Ratchet? ?? ?? RFC6455 WebSocket ????? ??? ???? ?? ???, ??? ? ?? ???? ??? ??? ????. ??? Ratchet? STOMP, WAMP ?? ?? WebSocket ?? ????? ???? ???? ??? ??? ? ??? ??? ??? ?? ??? ?????.
3. ??? ??? ???? ?? ?? ??
????? ??? ??? ??????? ???? ??? ??? ???? ?? PHP ? WebSocket? ???? ??? ?????.
- Ratchet ??
Ratchet? ?? ?? ???? ?????. Composer? ?? ??? ? ????.
composer require cboden/ratchet
- WebSocket ?? ??
?? ??? ???? server.php PHP ??? ????.
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetWebSocketMessageComponentTrait;
class Chat implements MessageComponentInterface
{
use MessageComponentTrait;
protected $clients;
public function __construct()
{
$this->clients = new SplObjectStorage();
}
public function onOpen(ConnectionInterface $conn)
{
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})
";
}
public function onClose(ConnectionInterface $conn)
{
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected
";
}
public function onError(ConnectionInterface $conn, Exception $e)
{
echo "An error has occurred: {$e->getMessage()}
";
$conn->close();
}
public function onMessage(ConnectionInterface $from, $msg)
{
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
}
$server = new RatchetWebSocketWsServer(new Chat());
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server = new RatchetServerIoServer($server, $socket, $loop);
echo "Server started
";
$server->run();
?? ??? ?? 8080?? ?? ???? ????? ??? ???? ??? ??? ??? ?????. ?????? ???? onOpen ???? ???? ????? ?? ??? ObjectStorage ??? ?????. ?????? ???? ??? onMessage ???? ???? ??? ??? ?? ??????? ???? ????. ????? ??? ???? onClose ???? ???? ObjectStorage ???? ????? ?? ??? ?????.
- Writing a WebSocket client
?? ??? ???? HTML ?? client.html? ????.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Chat Room</title>
<style>
#messages {
margin-bottom: 10px;
padding: 5px;
border: 1px solid #ddd;
overflow-y: scroll;
height: 200px;
}
</style>
</head>
<body>
<div>
<input type="text" id="input-message" placeholder="Write a message...">
<button id="btn-send">Send</button>
</div>
<div id="messages"></div>
<script>
var conn = new WebSocket('ws://localhost:8080');
var messages = document.getElementById('messages');
var inputMessage = document.getElementById('input-message');
var btnSend = document.getElementById('btn-send');
conn.onopen = function(e) {
messages.innerHTML += '<div>Connected to server</div>'
};
conn.onmessage = function(e) {
messages.innerHTML += '<div>' + e.data + '</div>'
};
conn.onerror = function(e) {
console.log('An error occurred: ' + e.data);
};
conn.onclose = function(e) {
messages.innerHTML += '<div>Connection closed</div>'
};
btnSend.onclick = function() {
if (inputMessage.value) {
conn.send(inputMessage.value);
inputMessage.value = '';
}
};
inputMessage.addEventListener('keydown', function(e) {
if (e.keyCode === 13 && inputMessage.value.trim()) {
conn.send(inputMessage.value);
inputMessage.value = '';
}
});
</script>
</body>
</html>
? ??? ??? ??? ?????? ??? WebSocket? ?? ??? ??? ???? ??? ???? ????. . ???? ??? ??? ???? ???? ??? ??? ????? Enter ?? ??? ?? ???? ??? ???? ???? ?????.
- WebSocket ?? ? ????? ??
????? WebSocket ?? ??:
php server.php
? ?????? ????? ??? client.html? ?? ???? ???? ??? ???? ??? ???? ?? ? ? ????. , ??? ??? ?? ?????? ??? ???? ?? ???. ?? ??? ??? PHP? WebSocket? ???? ??? ??? ????? ??????.
4. ??
????? ?? ??? ?? ??? ?? ????? WebSocket? ??? ?? ??? ??? ??? ?????. ??? PHP? ??? WebSocket ?? ?????? ?????? ????? ????? ??? ???? WebSocket ??????? ?? ??? ? ????. ? ??? WebSocket ??? ? ? ???? ???? ? ?? ??? ?? ??????? ???? ? ??? ??? ????.
? ??? PHP? WebSocket? ???? ??? ??? ???? ??? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!