如何访问棘轮 php 定期循环和客户端在应用程序内发送? [英] How do I access the ratchet php periodic loop and client sending inside app?

查看:23
本文介绍了如何访问棘轮 php 定期循环和客户端在应用程序内发送?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个运行良好的 Ratchet 服务器和聊天应用程序类.我的问题是如何添加周期性循环?

I have a Ratchet server and chat app class which runs fine. My problem is how do I add a periodic loop?

我尝试按照 定期向 Ratchet 中的客户端发送消息中的示例

但我一直无处可去.我和这个人一样的目标是让服务器检查所有客户端是否还活着.每次我尝试使用 addPeriodicTimer 时,我似乎无法像上面链接中的人那样访问 chat.php 中的 $clients 公共属性,以便从 server.php 中的计时器发送消息.server.php 中周期性计时器中的 foreach 循环不断抱怨它显然有一个无效参数".

But I have been getting nowhere. My goal like this guy, is for the server to check all clients are still alive. Everytime I try to use the addPeriodicTimer, I cant seem to access the $clients public property in chat.php like the guy from the link above could in order to send messages from the timer in server.php. The foreach loop in the periodic timer in server.php keeps complaining that it apparently has an "invalid argument".

谁能看出我做错了什么?

Can anyone see what im doing wrong?

我的 server.php 代码:

my 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();
?>

还有我的 chat.php:

and my 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();   
}

}

?> 

推荐答案

为什么不在传入 HTTPServer 之前定义 Chat 对象实例:

Why not define the Chat object instance before passing into HTTPServer:

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

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


$server->run();

这篇关于如何访问棘轮 php 定期循环和客户端在应用程序内发送?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆