Periodisches Senden von Nachrichten an Clients in Ratchet
Ich versuche in regelmäßigen Abständen eine "Hallo Welt!" Nachricht an alle mit dem Chat-Server verbundenen Clients aus dem Ratchet-Tutorial
Ich werde den gesamten Code hier posten: Chat.php:
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
public $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
//this worked but I don't want this behaviour
public function onMessage(ConnectionInterface $from, $msg) {
/*$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
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) {
// The connection is closed, remove it, as we can no longer send it messages
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
chat-server.php:
<?php
use Ratchet\Server\IoServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new Chat(),
8080
);
$server->run();
Um zu testen, wie viele Dokumente ich verstanden habe, habe ich der Serverschleife einen Timer hinzugefügt
<?php
use Ratchet\Server\IoServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new Chat(),
8080
);
// My code here
$server->loop->addPeriodicTimer(5, function () {
echo "custom loop timer working !";
});
$server->run();
und es hat gut funktioniert, diesen String alle fünf Sekunden nach dem Start des Servers auszugeben.
Jetzt habe ich versucht, es so zu machen, indem ich versuchte, eine Nachricht an Clients zu senden, die in MessageComponentInterface gespeichert sin
$server->loop->addPeriodicTimer(5, function () {
foreach ($server->app->clients as $client) {
$client->send("hello client");
}
});
Aber ich bekomme, dass $ server-> app NULL ist, was wahrscheinlich daran liegt, dass ich jetzt im function () -Block bin. Ich bin kein Experte, wenn es um objektorientiertes PHP geht, und dieses kleine Projekt wird sicher helfen ich viel. Wie kann ich auf das @ zugreifMessageComponentInterface
namensapp
Eigenschaft des Servers innerhalb des Timers und dann Daten an die dort gespeicherten Clients senden?