gpt4 book ai didi

php - 如何访问 Ratchet php 周期性循环和客户端在应用程序内发送?

转载 作者:可可西里 更新时间:2023-10-31 22:50:46 26 4
gpt4 key购买 nike

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

我尝试按照 Periodically sending mesages to clients in Ratchet 中的示例进行操作

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

谁能看出我做错了什么?

我的 server.php 代码:

<?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:

<?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 对象实例:

$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 - 如何访问 Ratchet php 周期性循环和客户端在应用程序内发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38565712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com