首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在RApache中冲洗电流输出?

如何在RApache中冲洗电流输出?
EN

Stack Overflow用户
提问于 2013-05-08 03:22:59
回答 1查看 272关注 0票数 2

我正在使用RApache作为SSE (服务器发送事件)和类似(长轮询、彗星等)进行测试。后端。我似乎被困在如何冲洗我的输出上。有可能吗?

下面是我的测试R脚本:

代码语言:javascript
复制
setContentType("text/plain")

repeat{
    cat(format(Sys.time()),"\n")
    #sendBin(paste(format(Sys.time()),"\n"))
    flush(stdout())
    Sys.sleep(1)
    }

我的Rapache.conf条目是:

代码语言:javascript
复制
<Location /rtest/sse>
    Options -MultiViews
    SetHandler r-handler
    RFileHandler /var/www/local/rtest/sse.r
</Location>

我用wget或curl来测试它:

代码语言:javascript
复制
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模块运行时如何实现刷新:apache2.c#l290 --我认为关键是调用了ap_rflush(r)。我猜RApache不是在打ap_rflush()电话。

EN

回答 1

Stack Overflow用户

发布于 2013-10-25 17:31:51

你传递了错误的哑剧类型。试着用

代码语言:javascript
复制
setContentType("text/event-stream")

EDIT1:

这就是我在下面的注释中提到的在Rook中实现SSE的尝试(仍然不成功)。

代码语言:javascript
复制
<%
  res$header('Content-Type', 'text/event-stream')
  res$header('Cache-Control', 'no-cache')
  res$header('Connection', 'keep-alive')
  A <- 1

  sendMessage <- function(){
    while(A<=4){
      cat("id: ", Sys.time(), "\n", "data: hello\n\n", sep="")
      A <- A+1
      flush(stdout())
      Sys.sleep(1)
    }
  }

-%>

<% sendMessage() %>

while循环条件应该总是TRUE,但是我有同样的问题,所以我不得不做一个有限循环。

好的新消息是,我确实有数据到达浏览器。在开发工具中,我可以通过查看Response Header部分中的Response Header来判断。上面的代码是114,您可以在"Hello!“中更改"Hello”。上面写着118。

js代码是:(您也需要JQuery )

代码语言:javascript
复制
$(document).ready(function(){

  $("button").click(function(){

    var source = new EventSource("../R/sse.Rhtml");

    source.onopen = function(event){
      console.log("readyState: " + source.readyState);
    }

    source.onmessage = function(event){
      $("#div").append(event.data);
    };

    source.onerror = function(event){
      console.log(event);
    };

  });


});

所以,本质上

1)连接是打开的(readyState 1)

2)缓冲仍然存在

3)数据(缓冲后)到达浏览器,但在正确接收数据时发生错误。

EIDT2:

值得注意的是,brew()对上面的.Rhtml文件输出没有缓冲。必须在web服务器(内部服务器和Apache服务器)中配置缓冲数据流的配置。

顺便指出,甚至不需要flushcat的输出默认为stout()。因此,选项如下:

  1. Web服务器配置
  2. 与PHP的R等价物,它总是用于我所见过的任何ob_flush();实现中。this就是一个例子
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16432165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档