2014-04-23 108 views
2

這看起來應該是一件非常簡單的事情,但不幸的是,Web開發從來不是我的強項。將stdout流式傳輸到網頁

我有一堆腳本,我想從網頁中啓動它們並在頁面上看到實時標準輸出文本。有些腳本需要很長時間才能運行,所以普通的單一響應不夠好(我已經開始工作了)。

據我所看到的,我的選擇是

  • 標準輸出到一個文件中,並定期(每隔幾秒鐘),從客戶端發送一個請求,並與該文件的內容作出迴應。

  • 分塊的HTTP響應?我不確定這是否是他們所用的 - 我試圖實現這一點,但我想我可能會誤解他們的目的。

  • Websockets(我使用的是Luvit服務器,所以這不是一個選項)。

  • ...還有其他的東西嗎?

我確定必須有一個標準的實現方式,我看到其他網站一直在這樣做。例如Teamcity。或者聊天室(香草TCP套接字?)。

任何在正確的方向指針讚賞。最簡單的方法可能,如果這只是從客戶端發送大量計劃的請求,那就這樣吧。

+0

是否需要以任何方式縮放?平行使用一個用戶,而不是1000,我認爲? –

+0

這與Lua有什麼關係? – lhf

+0

我正在使用Luvit,如果可能的話,我想要一個純粹的lua解決方案 - 我目前正在查看lua websockets的實現 – Sam

回答

2

這讓我想起了CGI

你自己的想法聽起來都像是正確的方向。當你使用shell腳本,以及一些可能與web服務器進行非平凡的交​​互時,我覺得指出在哪裏挖掘這種代碼的例子是很有意義的,這種代碼很久以前就很常見了,基本上都是傾向的。


實際上,您的腳本是一個CGI腳本,執行典型的事情。

在互聯網的早期和幾年中,這是實現不僅僅是靜態文件(HTML或其他)的網頁的「常規方式」。 該頁面基本上實現爲一個shell腳本(或任何其他從stdin讀取並寫入stdout的程序)。

你所做的/提出的部分內容非常相似,我認爲從舊的CGI代碼中學習很有用。
例如,通過sdtout從腳本內部獲取緩衝權,通過Web服務器到客戶端頁面上可能會非常棘手。因此,挖掘舊的例子可以幫助很多。

(這在很大程度上可能是明顯的給你,OP,個人,所以採取了「你」作爲潛在的讀者)
最棘手的部分,一般將緩衝,我期待。如果你習慣在shell中明確地處理stdin/out緩衝區,對於那些不支持它的程序來說,可以設想一下預期的事情 - 但是如果不習慣的話:我記得CGI更糟,因爲你必須得到HTTP服務器的緩存同步(讓我們希望它自動處理) - 所以也許開始提問/儘早挖掘例子。


CGI風格的方式正是你現在實現的 - 它的緩衝是正確的,應該是實時的,因爲它可以得到。但是我明白你會因爲運行時間過長而超時?或者你的運行時間有很大的不同?

在儘可能實時的方面,沒有什麼比寫入標準輸出到http流更好。
(我假設我們接受通過HTTP服務器的開銷。) 另外,我在考慮行緩衝,所以不要衝刷每個字符 - 對於用例來說足夠好了嗎? (即沒有動畫進度指示線/ ANSI逃脫,你想實時看到)
那麼最好的辦法就是解決超時等問題,但要保持這個概念。如果實時並不那麼重要,當然其他方式在許多方面可能會更好。有一點可能是其他方法可能需要任何可伸縮性。

+0

執行腳本不是問題 - 由於一個請求而不斷將某些更新流式傳輸到頁面是... – Sam

+0

它更有幫助嗎? –

+0

排序 - 感謝您花時間。我仍然堅持認爲「就儘可能實時獲取它而言,沒有什麼比編寫http流的stdout更好了。」什麼流?我認爲HTTP是一個請求 - 響應模型? – Sam