RApache を SSE (Server Sent Events) および同様の (ロング ポール、コメットなど) バックエンドとして使用してテストしています。出力をフラッシュする方法にこだわっているようです。出来ますか?
これが私のテスト 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 をそのように動作させる方法はありますか?
更新 2flush.console()
前または後に追加しようとしましたflush(stdout())
が、違いはありません。トップもやってみsetStatus(status=200L)
ました。SERVER$no_cache=T;SERVER$no_local_copy=T;
そして、スクリプトの先頭で試しました。繰り返しますが、違いはありませんでした。(はい、どれも役に立たなかったはずですが、試してみて損はありません!)
PHP が Apache モジュールとして実行されている場合にフラッシュを実装する方法へのリンクは次のとおりです
。 #l290
キーポイントは への呼び出しがあることだと思いますap_rflush(r)
。私は、RApache がap_rflush()
呼び出しを行っていないと推測しています。