Wie greife ich auf die periodische php-Schleife und den Client zu, die in der App gesendet werden?

Ich habe einen Ratchet-Server und eine Chat-App-Klasse, die gut funktioniert. Mein Problem ist, wie füge ich eine periodische Schleife hinzu?

Ich habe versucht, dem Beispiel in @ zu folgePeriodisches Senden von Nachrichten an Kunden in Ratchet

Aber ich habe nirgendwo hin bekommen. Mein Ziel ist es, dass der Server überprüft, ob alle Clients noch am Leben sind. Jedes Mal, wenn ich versuche, den addPeriodicTimer zu verwenden, kann ich nicht auf die öffentliche Eigenschaft $ clients in chat.php zugreifen, wie es der Typ über den obigen Link könnte, um Nachrichten vom Timer in server.php zu senden. Die foreach-Schleife im periodischen Timer in server.php beklagt sich immer wieder, dass es anscheinend ein "ungültiges Argument" gibt.

ann jemand sehen, was ich falsch mach

mein server.php Code:

<?php


require($_SERVER['DOCUMENT_ROOT'].'/var/www/html/vendor/autoload.php');
require_once($_SERVER['DOCUMENT_ROOT']."/var/www/html/bin/chat.php");

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ram\Chat;


$server = IoServer::factory(new HttpServer(new WsServer(new Chat())), 8080);

 // Server timer <------ having trouble here
$server->loop->addPeriodicTimer(5, function () use ($server) {
foreach($server->app->clients as $client)
{
    //$client->send("[helloworld]");    
}
});


$server->run();
?>

und meine chat.php:

<?php
namespace Ram;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;


error_reporting(E_ALL ^ E_NOTICE);
session_id($_GET['sessid']);
    if(!session_id)
        session_start();


    $userid = $_SESSION["userid"];
    $username = $_SESSION["username"];
    $isadmin = $_SESSION["isadmin"];
    $resources = array();





    class Users
    {
        public $name;
        public $resid;
        public $timestamp;



    }



class Chat implements MessageComponentInterface
{
    public $clients;








    var $users = array();



    /*
    function cmp($a, $b)
    {
        return strcmp($a->name, $b->name);
    }


    function removeObjectById(ConnectionInterface $id , $arr)
    {
         $array = $arr;

        foreach ( $array as $key => $element ) {
            if ( $id->resourceId == $element->resid ) 
            {
                unset($array[$key]);
                break;
            }
         }

         usort($array, "cmp");

         return $array;
    }

    */




    public function __construct()
    {

        $this->clients = new \SplObjectStorage; 






    }

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients->attach($conn);  





    }

    public function onClose(ConnectionInterface $conn)
    {

        //$users = removeObjectById($conn, $users);

        $this->clients->detach($conn);



    }

    public function onMessage(ConnectionInterface $conn, $msg)
    {
         $msgjson = json_decode($msg);
         $tag = $msgjson->tag;

         if($tag == "[msgsend]")
         {

            foreach($this->clients as $client)
            {
                  $client->send($msg);    
            }
     }
     else if($tag == "[bye]")
     {

         foreach($this->clients as $client)
         {
              $client->send($msg);    
         }

         $this->clients->detach($conn);
     }
     else if($tag == "[connected]")
     {
         //store client information
         $temp = new Users();
         $temp->name = $msgjson->uname;
         $temp->resid = $conn->resourceId;
         $temp->timestamp = date('Y-m-d H:i:s');

         $users[] = $temp;

         //usort($users, "cmp");


         //send out messages
          foreach($this->clients as $client)
         {
              $client->send($msg);    
         }



     }
     else if($tag == "[imalive]")
     {
         //update user timestamp who sent [imalive]
         if (is_array($users) || is_object($users))
         {
             foreach($users as $user)
             {
                if($msgjson->uname == $user->name)
                {
                        $user->timestamp = date('Y-m-d H:i:s'); 
                }
             }
         }
     }







}

public function onError(ConnectionInterface $conn, Exception $e)
{
    echo "Error: " . $e->getMessage(); 
    $conn -> close();   
}

}

?> 

Antworten auf die Frage(2)

Ihre Antwort auf die Frage