Я использую этот серверный скрипт для создания сервера Websocket (server.php
).Это отлично работает.
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\WebSocket\WsServerInterface;
require 'vendor/autoload.php';
require_once 'db.php';
class MyClass implements MessageComponentInterface, WsServerInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
$name = str_replace('/', '', $conn->httpRequest->getUri()->getPath());
$resourceId = $conn->resourceId;
$stmt = $db->prepare("INSERT INTO clients (id, resourceId, name) VALUES (null, :resourceId, :name)");
$stmt->bindParam(':resourceId', $resourceId, PDO::PARAM_STR);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->execute();
ConnectDB::closeConnection($db);
echo "Connected (" . $resourceId . ")\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$name = str_replace('/', '', $conn->httpRequest->getUri()->getPath());
$request = json_decode($msg);
if (json_last_error() === JSON_ERROR_NONE) {
require_once 'process.php';
$response = processRequest($msg);
if ($response !== false) {
$from->send($response);
}
} else {
$from->send('JSON error');
$ActionType = 'Connect';
}
echo "Incoming message - " $name "\n";
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
echo "Closed\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(
new WsServer(
new MyClass()
)
),
8080
);
$server->run();
Я сохраняю идентификатор $resourceId = $conn->resourceId;
в базе данных.
Я хотел бы сделать еще один сценарий php, в настоящее время test.php
, который может отправлять сообщения клиентам через храповик.
Вот test.php
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\WebSocket\WsServerInterface;
require 'vendor/autoload.php';
require_once 'db.php';
$to = 119; // hard-coded id, not using database yet
$msg = json_encode(array("test" => "test"));
class Sender implements MessageComponentInterface, ConnectionInterface {
public function send(ConnectionInterface $to, $msg) {
$client = $this->clients[$to];
$client->send($msg);
}
}
Sender::send($to, $msg);
Ошибка:
Fatal error: Declaration of Sender::send() must be compatible with Ratchet\ConnectionInterface::send($data) in test.php on line 20
Это не работает, и я не знаю, правильный ли это подход.Я не хочу отвечать на входящее сообщение (которое в настоящее время работает), а в конечном итоге отправить сообщение из формы на test.php
.
Примеры Ratchet (Hello world) в основном используют сервер для ретрансляциисообщения между клиентами.В моем случае я хочу, чтобы сервер общался только назад с отдельными клиентами.Клиенты никогда не общаются друг с другом.Кроме того, форма на test.php
не создает клиента и не ожидает ответа.
Может ли кто-нибудь направить меня в правильном направлении для отправки сообщений непосредственно клиентам?