我正在使用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事件,因为它允许我从一个地方的不同控制器收集所需数据,然后从那里,我可以创建事件流(服务器发送事件)。如果有更好的选择,请分享。答案 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的乐趣和学习目的。