我正在开发一个可以充分利用异步流的Catalyst / psgi应用程序,但是除了一个简单的计时器(比如这里:http: //www.catalystframework.org/calendar/2013/13),我有点对如何实施更多“全球”事件感到困惑。
通过全球事件,我的意思是:
- 对所有客户端都相同的周期性计时器
- 单个客户端对给定页面的访问(但会更新所有客户端)
- 一个文件状态观察器,当文件更改时将更新所有客户端。
如果我错了,请纠正我,但对我来说,这些似乎与上面链接的示例非常不同,这将为每个客户提供不同的计数器。我希望有“全面”发生的事件。
我尝试过的一个例子(使用上面列表中的#2):
has 'write_fh' => ( is => 'rw', predicate => 'has_write_fh' );
sub events : Path('/stream') Args(0) {
my ( $self, $c ) = @_;
$c->res->body("");
$c->res->content_type('text/event-stream');
$self->write_fh( $c->res->write_fh() );
}
sub trigger : Path('/trigger') : Args(0) {
my ( $self, $c ) = @_;
$self->write_fh->write( *the event string* );
}
当我运行它时,它实际上比我预期的更进一步 - 事件确实被触发,但不可靠。打开两个浏览器时,有时将事件发送到一个,有时发送到另一个。
现在,我想我明白为什么这永远行不通了——点击 /trigger 的客户端不知道所有其他正在观看 /stream 的客户端,因此我尝试使用的 write_fh 没有用。
但是,如果每个客户的请求都在自己包含的气泡中,我如何从其他请求访问他们的流?
还是我完全走错了路……?