2016-07-16 15 views
0

Ich versuche, regelmäßig eine "Hallo Welt!" Nachricht an alle Clients mit dem IRC-Server aus der Ratsche TutorialIn regelmäßigen Abständen Nachrichten an Clients in Ratchet senden

angeschlossen ich 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 viel der docs ich verstanden, ich habe einen Timer auf der Server-Schleife

<?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(); 
hinzugefügt

und es funktionierte gut, diese Zeichenfolge alle fünf Sekunden auszugeben, nachdem der Server gestartet wurde.

Jetzt habe ich versucht, es wie so tun, versuchen, eine Nachricht an Kunden in der MessageComponentInterface genannt Chat aus dem

$server->loop->addPeriodicTimer(5, function() {   
    foreach ($server->app->clients as $client) {     
      $client->send("hello client");   
    } 
}); 

Tutorial gespeichert zu senden, aber ich bin immer, dass server- $> App ist NULL das ist wahrscheinlich, weil ich jetzt in der Funktion() Block bin. Ich bin kein Experte, wenn es um objektorientierte PHP geht, und dieses kleine Projekt wird mir sicher sehr helfen. Wie kann ich auf die MessageComponentInterface namens app Eigenschaft des Servers innerhalb des Timers zugreifen und dann Daten an die dort gespeicherten Clients senden?

+0

hinzufügen 'Verwendung ($ Server)' nach 'function()' –

+0

'Verschlüsse können auch Variablen erben aus dem übergeordneten Bereich. Solche Variablen müssen an das Sprachkonstrukt übergeben werden. Https://secure.php.net/manual/en/functions.anonymous.php –

+0

'$ server' ist NULL im Closure, weil es nicht in definiert wurde der Funktionsumfang Lesen Sie mehr darüber hier https://secure.php.net/manual/en/language.variables.scope.php –

Antwort

2

$server ist nicht im Funktionsumfang definiert, und Variablen aus dem übergeordneten Bereich werden standardmäßig nicht an den untergeordneten Bereich vererbt. Closures können mithilfe des Sprachkonstrukts use Variablen aus dem übergeordneten Bereich erben.

$server->loop->addPeriodicTimer(5, function() use ($server) {   
    foreach ($server->app->clients as $client) {     
      $client->send("hello client");   
    } 
}); 

Weitere Informationen über anonyme Funktionen (Verschlüsse): https://secure.php.net/manual/en/functions.anonymous.php
Weitere Informationen über Umfang Variablen: https://secure.php.net/manual/en/language.variables.scope.php

Verwandte Themen