问题描述
我有一个运行良好的 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 定期循环和客户端在应用程序内发送?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!