【发布时间】:2013-05-02 04:20:49
【问题描述】:
我正在使用 RApache 作为 SSE(服务器发送事件)和类似的(长轮询、彗星等)后端进行测试。我似乎被困在如何刷新我的输出上。有可能吗?
这是我的测试 R 脚本:
setContentType("text/plain")
repeat{
cat(format(Sys.time()),"\n")
#sendBin(paste(format(Sys.time()),"\n"))
flush(stdout())
Sys.sleep(1)
}
我的 Rapache.conf 条目是:
<Location /rtest/sse>
Options -MultiViews
SetHandler r-handler
RFileHandler /var/www/local/rtest/sse.r
</Location>
我使用 wget 或 curl 对其进行测试:
wget -O - http://localhost/rtest/sse
curl http://localhost/rtest/sse
两者都坐在那里,意味着什么都没有发送。
使用sendBin() 没有改变,使用flush() 也没有。
如果我将repeat 更改为for(i in 1:5),那么它会在那里停留 5 秒,然后显示 5 个时间戳(间隔 1 秒)。所以,我相信其他一切都运行良好,这纯粹是一个缓冲问题。
更新: 5 个月后以全新的眼光看待这个问题,我想我可以更清楚地描述问题:问题是 RApache 似乎正在缓冲所有输出,并且不发送任何内容直到 R 脚本退出。为了对流式传输有用,每次调用 flush() 时,即当 R 脚本仍在运行时,它必须将数据从 Apache 发送到客户端。
所以,我的问题是:有没有办法让 RApache 表现得像那样?
更新 2 我尝试在 flush(stdout()) 之前或之后添加 flush.console() 但没有区别。我还在顶部尝试了setStatus(status=200L)。我在脚本顶部尝试了SERVER$no_cache=T;SERVER$no_local_copy=T;。再次没有任何区别。 (是的,这些应该都没有帮助,但尝试永远不会有坏处!)
这里是 PHP 在作为 Apache 模块运行时如何实现刷新的链接:
http://git.php.net/?p=php-src.git;a=blob;f=sapi/apache2handler/sapi_apache2.c#l290
我认为关键是有一个电话到ap_rflush(r)。我猜 RApache 没有拨打ap_rflush() 电话。
【问题讨论】:
-
感谢您的更新。你能发布调用
.rhtml文件的javascript吗? -
@Michele 没有rhtml页面,我是用wget和curl测试的,如上图。 (我不希望浏览器混淆这个问题。)
-
哦,我明白了。对不起,我想帮忙,但我可能会让你感到困惑......
-
大家好,在link 的下一条关于
flush.console的消息中,Simon Urbanek 提到了一些关于TERM=dumb的信息。我不知道这是否有帮助。
标签: rapache