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

2023-11-25

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

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

但我却一事无成。 我的目标就像这个人一样,是让服务器检查所有客户端是否仍然存在。 每次我尝试使用 addPeriodicTimer 时,我似乎无法像上面链接中的人一样访问 chat.php 中的 $clients 公共属性,以便从 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();   
}

}

?> 

为什么不定义Chat传入之前的对象实例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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问ratchet php周期性循环和客户端在应用程序内发送? 的相关文章

  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f
  • 如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

    有谁知道如何使用配置文件 ebextensions 在 AWS Elastic Beanstalk 上安装和启用 PHP IMAP 扩展 我使用的是 64 位 Amazon Linux 2017 03 v2 4 0 运行 PHP 7 0 1
  • 获取今天的科普特日期

    我正在寻找获取今天的科普特日期与任何代码类型类似php or javascript在我的网站标题中显示科普特日期 我需要阿拉伯语或英语版本 我试图找到它 但没有找到类似的英文内容 参考 http www copticchurch net e
  • Web 服务响应包含无效的 XML 字符

    我的应用程序正在连接到 Web 服务 rpc encoded 我使用的是 Axis 1 4 当 Web 服务发送响应时 它会发送一个无效字符 然后发送一个异常 http xml apache org axis stackTrace org
  • file_get_contents 大文件上传

    我正在尝试使用 fsockopen 上传 2GB 以上的大文件 但 file get content 出现以下错误 我无法在内存中存储大文件 我需要分块发送数据 但不知道如何执行此操作 请问有人可以指导我吗 致命错误 允许的内存大小 134
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • 将查询字符串附加到任何形式的 URL

    我要求用户在文本框中输入 URL 并需要向其附加查询字符串 URL 的可能值如下 http www example com http www example com http www example com a http www examp
  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • Ajax文件上传

    我想使用 Ajax 和 php 上传文件 我有一个表格
  • 纯基于网络的版本控制系统

    我的托管服务当前不允许在其服务器上运行 允许 svn git cvs 我真的希望能够将我的开发计算机上的当前源代码与我的生产服务器 同步 我正在寻找一个纯php python ruby版本控制系统 不只是一个client对于版本控制系统 不
  • yii2 中的自动完成

    在 Yii2 中 我希望当用户开始输入时 我的输入字段之一能够自动完成 下面是我的代码 它使用Jui Autocomplete 这是行不通的 当我打印我的数组时 我就像 Array 1 gt abc 2 gt xyz 4 gt pqr
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • Paypal 将钱从一个帐户转移到另一个帐户

    我知道这个建议如何汇款至任何 PayPal 账户 https stackoverflow com questions 1559808 paypal api send money to any paypal account但到目前为止我所尝试
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • PHP LDAP 查询获取特定安全组的成员

    我正在努力让 LDAP 查询工作来为我提供安全组的成员 我们的活动目录结构设置为 DC domain DC co dc uk然后 我们有一个名为 公司用户 的 OU 其中有一个用于 IT 和标准的 OU 在这些中我们创建了用户 所以我被设置
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia

随机推荐

  • Android 真的没有 wchar_t 吗?

    我建立了一个简单的方法 如下所示 wchar t buf 1024 void logDebugInfo wchar t fmt va list args va start args fmt vswprintf buf sizeof buf
  • 使用 JAX-RS 创建 RESTful Web 服务并将其部署到 tomcat

    我正在尝试使用 JAX RS 创建和部署 RESTful Web 服务并将其部署到 tomcat 我不想使用任何 IDE 在 Tomcat 中 我在 webapps 中有以下目录结构 notifire WEB INF gt web xml
  • 显示所有表的所有数据

    我想显示数据库中的所有数据而不编写select对于每个表 我该怎么做 我不想这样做 select from Customer select from Employee select 我正在将 TSQL 与 MSSQL Server 一起使用
  • 在 Swift 中添加和减去时间

    我用伪代码编写了其中一些内容 因为我不知道它的语法 我想要timeLeftLabel text反映 6 小时结束前还剩多少小时 分钟和秒 我最大的问题是我不知道如何加减时间 谁能帮我 var timer NSTimer func timer
  • 如何在 Primefaces DataTable 中使用 Font Awesome(或其他字体图标)而不是 jQuery sprite?

    我正在使用 PrimeFaces 生成数据表 默认的排序图标是 JQuery 库中的 V 形图标 但由于它们不是 Vector 因此看起来很难看 我不想使用像 font Awesome 这样的字体来替换它们 但我不知道如何做到这一点 我可以
  • 如何将 SolrQuery(SOLRJ) 转换为 URL?

    在使用 SOLRJ 时 我想知道如何使用 SOLR 查询语法将 SolrQuery 对象转换为其 URL 表示形式 我尝试使用 toString 方法 但它没有返回正确的查询表示 还有其他方法吗 我建议ClientUtils toQuery
  • 从您的应用程序启动 Facetime?

    我发现您可以通过以下方式从您的应用程序启动 FaceTime UIApplication sharedApplication openURL NSURL URLWithString facetime tel number 我还读到 由于没有
  • 拼接后计算源图像的坐标

    我使用 opencv 的全景拼接算法 将 2 或 3 个图像拼接成一个新的结果图像 我有每个源图像中的点的坐标 我需要计算结果图像中这些点的新坐标是什么 我在下面描述该算法 我的代码类似于示例 缝合 详细 来自 opencv 分支 3 4
  • 数组的 N 重分区,每个分区的总和相等

    给定一个整数数组a 两个数N and M 返回N一组整数从a使得每个组的总和为M 例如 说 a 1 2 3 4 5 N 2 M 5 然后算法可以返回 2 3 1 4 or 5 2 3 或者可能是其他人 我在这里可以使用什么算法 Edit 我
  • 在 iOS 中的 Instagram 上与图像共享文本

    在我的应用程序中 我在 Instagram 上分享了一张图片 它在我的应用程序中运行良好 我正在使用以下代码 property nonatomic retain UIDocumentInteractionController dic CGR
  • ASPNET Boilerplate,扩展审核日志

    我正在尝试延长AuditLog实体在ASPNET样板框架 以便向其添加一些新属性 我曾尝试延长AuditLog class ExtendedAuditInfo 并实现一个定制版本AuditStore Class ExtendedAuditS
  • 如何在 C# 中列出 .zip 文件夹的内容?

    如何在 C 中列出压缩文件夹的内容 例如 如何知道压缩文件夹中包含多少个项目 以及它们的名称是什么 NET 4 5 或更高版本最终具有处理通用 zip 文件的内置功能System IO Compression ZipArchive clas
  • 禁用 Internet Explorer 8 开发人员工具

    有没有办法禁用 Internet Explorer 8 开发人员工具 或者至少更改快捷键映射 我正在开发一个 ASP NET AJAX 应用程序 该应用程序多年来一直使用 F12 键来实现某个功能 它实际上是原始 DOS 应用程序的保留 客
  • 在多层应用程序中定位 Ninject 模块的位置

    我的应用程序包括许多后端程序集 包括实体框架数据存储库层 它们由许多前端程序集 包括 Windows 服务和 MVC3 Web 应用程序 共享 我对 Ninject 绑定过程的理解是 每个包含可注入类型的程序集还应该包含一个定义这些类型的默
  • Bash 最后一个索引

    很抱歉这个蹩脚的 bash 问题 但我似乎无法解决 我有以下简单的情况 我有像这样的变量artifact 1 2 3 zip 我想在连字符和点的最后一个索引之间获取一个子字符串 两者都是互斥的 我的bash技能不太强 我有以下内容 a ar
  • SBT:将输入预先应用到 inputKeys

    在 SBT 中 我想定义一个 inputKey 来读取命令行参数 稍微更改它们并uses结果作为其他 inputKey 的输入 I tried lazy val demo inputKey Unit A demo input task la
  • SQL Server 全文搜索精确匹配并回退

    首先 似乎无法使用全文搜索获得精确匹配 在使用全文搜索方法时 这似乎是一个备受讨论的问题 并且有很多不同的解决方案可以实现所需的结果 但大多数似乎效率很低 由于我的数据库容量很大 我被迫使用全文搜索 因此我最近不得不实施其中一种解决方案以获
  • 将 MATLAB 链接到 DLL 库

    我正在尝试执行 MATLAB 工具包中的一些示例代码 oscmex 该工具包允许使用 OSC 协议通过 MATLAB 进行通信 我认为这个问题是不具体的 它应该适用于any工具包就是按照这个方式设置的 撇开原因不谈 我在启动和运行该工具包时
  • 将日期和时区从 GAE 服务器发送到 GWT 客户端

    好吧 伙计们 我已经解决这个问题大约两周了 现在尝试了我能想到的一切 并查看了这里的大量答案 感觉他们会回答这个问题 但我就是不知道我该怎么做做我想做的事 这让我发疯 似乎没有人在任何地方都有答案 到处都有一半的答案 但似乎没有人真正做我需
  • 如何访问ratchet php周期性循环和客户端在应用程序内发送?

    我有一个运行良好的 Ratchet 服务器和聊天应用程序类 我的问题是如何添加周期性循环 我尝试按照中的示例进行操作定期向 Ratchet 中的客户端发送消息 但我却一事无成 我的目标就像这个人一样 是让服务器检查所有客户端是否仍然存在 每