http - 将 stdout 流式传输到网页

标签 http lua cgi stdout luvit

这看起来应该是一件很容易实现的事情,不幸的是,网络开发从来都不是我的强项。

我有一堆脚本,我想从网页启动它们并在页面上查看实时标准输出文本。一些脚本需要很长时间才能运行,因此正常的单一响应不够好(我已经开始工作了)。

据我所知,我的选择是

  • stdout 到文件,并定期(每隔几秒)从客户端发送请求并使用该文件的内容进行响应。

  • 分块 HTTP 响应?我不确定这是否是它们的用途 - 我已经尝试实现这一点,但我想我可能误解了它们的用途。

  • Websockets(我使用的是 Luvit 服务器,所以这不是一个选项)。

  • ...还有别的吗?

我确信必须有一种标准的实现方式,我看到其他网站一直在这样做。以团队城市为例。或者聊天室(vanilla TCP 套接字?)。

任何正确方向的指示表示赞赏。最简单的方法,如果只是从客户端发送大量预定请求,那就这样吧。

最佳答案

这让我想起了 Common Gateway Interfaces .

您自己的想法听起来都是正确的方向。当您使用 shell 脚本以及与 Web 服务器的一些潜在的重要交互时,我觉得指出在哪里挖掘这种代码的示例是有意义的,这种代码在很久以前很常见,而且非常错误-俯卧,基本上总是。


实际上,您的脚本是一个 CGI 脚本,执行典型的操作。

在互联网的早期和岁月里,这是实现网页的“正常方式”,而不仅仅是静态文件(HTML 或其他文件)。 该页面基本上是作为 shell 脚本(或任何其他从标准输入读取并写入标准输出的程序)实现的。

您正在做/提议的部分内容非常相似,我认为可以从旧的 CGI 代码中吸取有用的教训。
例如,通过 sdtout 从脚本内部获得正确的缓冲,通过 Web 服务器到客户端页面当然是很棘手的。 因此,挖掘旧示例可能会有很大帮助。

(对于您个人而言,其中大部分可能是显而易见的,因此请将“您”视为潜在读者)
我预计,一般而言,棘手的部分将是缓冲。如果您习惯于在 shell 中显式处理 stdin/out 缓冲区,对于不支持它的程序,可以想象会发生什么样的事情——但如果不习惯:我记得 CGI 更糟,因为你必须得到HTTP 服务器的缓冲也是同步的(我们希望它是自动处理的)——所以也许尽早开始提问/挖掘示例。


CGI 风格的方式正是您现在实现的方式——如果缓冲是正确的,那应该尽可能实时。但我知道你会因为运行时间长而超时?或者你有强烈不同的运行时间?

就尽可能实时地获取它而言,没有什么比将 stdout 写入 http 流更好的了。
(我假设我们接受通过 HTTP 服务器的开销。) 另外,我在考虑行缓冲,所以不要刷新每个字符——这对用例来说足够好了吗? (即没有您想实时看到的动画进度指示线/ANSI 转义符)
那么也许最好的办法是解决超时等问题,但要保留这个概念。当然,如果实时不是那么重要,那么其他方式在很多方面可能会更好。有一点是任何可扩展性都可能需要其他方法。

关于http - 将 stdout 流式传输到网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23238469/

相关文章:

php - 超过1450B的请求在PHP中正确读取POST请求参数?

html - 浏览器如何处理多次引用的不可缓存资源?

perl - 如何构建可以逐页移动的 CGI 程序?

java - 使用 Apache HttpClient v.4 执行 HTTP GET

http - 在浏览器地址栏中输入的任何内容都是 GET 请求吗?

Lua - 表中表打印和排序

Redis EVAL-per-event 或 EVAL-all-events-at-once

parsing - Lua:检查表是否可以通过 ipairs & ipairs 从 0 开始循环

ruby - 在 Apache 中设置 Ruby CGI

python - 使用python for CGI的问题