当前位置: 首页 > 知识库问答 >
问题:

使用Cakephp事件发送服务器附带事件?

爱博达
2023-03-14
class MyController extends AppController {
    public function someAction() {
        //........
        $event = new CakeEvent('Controller.MyController.example', $this, array(
            'data' => $someData
        ));
        $this->getEventManager()->dispatch($event);
        //.........
    }
}

并在config/bootstrap.php中添加了以下行:

require_once APP . 'Config' . DS . 'events.php';

在config/events.php中

App::uses('CakeEventManager', 'Event');
App::uses('MyListener', 'Lib/Event');
// Global Listener
CakeEventManager::instance()->attach(new MyListener());

在lib/event/mylistener.php中

App::uses('CakeEventListener', 'Event');
class MyListener implements CakeEventListener {

    public function implementedEvents() {
        return array(
        'Controller.MyController.example' => 'example',  
        );
    }

    public function example(CakeEvent $event) {
        /*Do some optional manipulation with the $event->data,then send the data using event stream.
        How can I call some another Controller to create event stream ?
        (Should I create Event Stream here itself? If yes, how?)
        I know how to create event stream in simple php :

        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
        header('Connection: keep-alive');

        echo "data: $someData\n\n";
        flush();
         */
    }
}

PS:我使用Cakephp事件是因为它允许我在一个地方从不同的控制器收集所需的数据,然后从那里,我可以创建事件流(服务器发送的事件)。如果有更好的选择,请分享。

共有1个答案

上官恩
2023-03-14

我认为这个问题很宽泛,要用一个合理的长文本来回答。因此,我建议您阅读这个问题和前两个答案服务器发送的事件和php是什么触发服务器上的事件?因为它很相似,很好地解释了SSE。

如果您了解SSE,您就会意识到您需要一个在循环中运行的php进程。我认为,来自libSSE库的代码或多或少是自我解释的。

class YourEventHandler extends SSEEvent {
    public function update(){
        //Here's the place to send data
        return 'Hello, world!';
    }
    public function check(){
        //Here's the place to check when the data needs update
        return true;
    }
}

$sse = new SSE();//create a libSSE instance
$sse->addEventListener('event_name',new YourEventHandler());//register your event handler
$sse->start();//start the event loop

您可以通过使用CakePHP shell实现这一点来归档相同的内容。

 类似资料:
  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 问题内容: 我正在尝试使用SSE将JSON数据发送到浏览器,但似乎无法正确处理,而且我也不知道为什么。 服务器端看起来像这样: 如您所见,我已经注释掉了帖子内容,但最终我希望将testdata用作JSON本身,如下所示: 客户端看起来像这样: 我看到控制台日志,但 没有看到警报。 问题答案: 尝试发送适当的JSON(输出中未引用): 但最好:

  • 我正在尝试在Ruby Grape API上创建服务器发送的事件。问题是,连接似乎总是很快关闭,因为我一直在测试网页上看到连接关闭事件。 客户端连接到服务器,因为我可以看到正在调用的方法,但我想知道为什么连接不是恒定的,为什么我没有收到我使用Thread发送的数据。 以下是我的Ruby代码: 以下是我的Javascript: 编辑:我使用GET方法实现了它(我将Grape::API更改为Sinatr

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 我有一个后端服务器,它将事件作为服务器发送的事件发送给客户端。我还没有找到一个好的库来在Android上处理这项技术,所以我一直在使用一种回退方法,定期检查服务器(通过访问事件endpoint)中的新事件。 后台服务每10秒执行一次。不用说,这不是最好的方法。如果没有任何开源库可用于此场景,那么在内存使用和电池消耗方面,定期检查服务器后端是否有新事件的最佳方法是什么?与在Android中管理开放式