使用Cakephp事件发送服务器端事件?

时间:2015-09-29 10:53:38

标签: php cakephp events cakephp-2.0 server-sent-events

我正在使用Cakephp事件和事件源/服务器发送事件(http://www.w3schools.com/html/html5_serversentevents.asp)进行实时更新。

从所有控制器,我发出这样的事件:

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

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

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

在Config / events.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();
         */
    }
}

在Lib / Event / MyListener.php中

{{1}}

如何创建事件流?

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

1 个答案:

答案 0 :(得分:1)

我认为这个问题远远不够广泛,需要在合理的长篇文章中回答。所以我建议你阅读这个问题和前两个答案Server-sent events and php - what triggers events on the server?因为它很相似并且很好地解释了SSE。

如果你理解了SSE,你会发现你需要一个能在循环中运行的php进程。我认为libSSE lib中的代码或多或少是自我解释的。

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实现此目的来归档相同的内容。

但是,您的应用需要将事件发送/更新到shell进程。一种方法是将其发送到DB并每隔X秒检查一次DB表以获取新发送的内容。这不是很高效,但易于存档。

另一个解决方案是让另一个侦听器允许您从php脚本发送一个事件,然后将事件数据发送给订阅者(http客户端)。您可以使用http://socketo.me/或多或少地完成此操作。

免责声明:我自己没有实施过SSE,但上面应该这样做,你现在有了工具和方向。我之前已经实现了Ratchet的乐趣和学习目的。