【问题标题】:How do I write CGI scripts using Haskell? [closed]如何使用 Haskell 编写 CGI 脚本? [关闭]
【发布时间】:2010-12-30 19:49:56
【问题描述】:

我想在 Haskell 中制作一个 Web 应用程序(例如,它可以是博客、论坛或一些动态网页),我需要什么?

(我知道我需要一个http服务器(例如apache或lighttpd)。我也知道我应该知道一些Haskell编程。)

我如何让这一切协同工作?我不明白整个包/设置。

我需要 mod_haskell 或其他模块吗?

请有人向我解释一下 apache 模块是如何工作的以及如何安装它们?

【问题讨论】:

  • 我无意冒犯,但这已经在互联网上一遍又一遍地写了。您想了解 Haskell 或如何构建服务器吗?
  • 不,我想解释一下所有 mod_somthing http-server 和编程语言如何协同工作?它们是如何连接在一起的 :-)
  • moshe:您的问题范围很广,可以通过多种方式回答。例如,mod_php 和 mod_python 模块是 Apache 扩展模块,因此它们与 Apache 堆栈一起工作。我所知道的没有 mod_haskell。并且所有 Web 服务器(包括 Apache)都支持通用网关接口 (CGI),这是做同样事情的另一种方式,尽管 CGI 的性能特征可能会因您使用的语言而有很大不同。简而言之:要获得有用的答案,您需要将问题限制在一种语言或一台网络服务器上。
  • 我不希望它只是在 haskell 中。 haskell 只是深奥(某种)语言的一个例子。无论如何,下面的人(glenatron)帮助我:-)
  • 我希望这不是人们来这里询问比萨食谱和人际关系建议的新趋势,因为他们听说#haskell 的人很有帮助。 “我老婆睡得太早了,我该怎么办?” -- “你试过 Hoogle 吗?”

标签: apache haskell cgi apache-modules


【解决方案1】:

也许你会发现HAppS 很有用。

【讨论】:

【解决方案2】:

对标题问题的简短回答:是的。

http://hackage.haskell.org/package/cgi

Network.cgi

用于编写 CGI 程序的简单库。看 http://hoohoo.ncsa.uiuc.edu/cgi/interface.html 用于 CGI 规范。

这是一个简单的例子,包括错误处理(并不是说有很多东西可以去 Hello World 有问题)

 import Network.CGI

 cgiMain :: CGI CGIResult
 cgiMain = output "Hello World!"

 main :: IO ()
 main = runCGI (handleErrors cgiMain)

关于部件的整合。

CGI 是 Web 服务器和一些外部程序之间的编程协议和接口,通过标准输入和输出进行通信并共享环境变量。

您需要一个支持 CGI 的 Web 服务器(大多数都支持),并且您必须对服务器进行配置,以便针对某些特殊请求(例如,具有某些特殊文件扩展名的 URL)调用 CGI 程序。对于 Apache 网络服务器,请参阅http://httpd.apache.org/docs/2.0/howto/cgi.html

【讨论】:

  • 感谢您的评论,但我不希望它使用特定的语言。我提到了haskell,因为它有点像ezoteric :-)。我想知道 mod_somthing、http 服务器和语言是什么,它们结合在一起。我不清楚制作网络应用程序(博客、论坛或只是动态网页)的所有过程:-)
  • 这里给出一个稍微大一点的例子:lukeplant.me.uk/blog/posts/ella
  • @PA。在 lighttpd 我需要为 cgi 执行以下操作:[...] ".pl" => "/usr/bin/perl"," [...] 但是我必须为 .hs 文件设置什么可执行文件?
【解决方案3】:

让我们假设您正在使用您选择的编程语言创建一个动态网站。

当用户访问您的网站时,他们会向http://name-of-your-site.com 发出请求,并将其传递到您的服务器。

当请求到达端口 80 时,它会被您的 HTTP 服务器收集,该服务器可能是 Apache,但也可能是 LightHttpd 或任何其他 HTTP 服务器。这将收到请求并决定如何处理它。

现在假设您的网站是用 python 编写的,它将在某处存储为一堆 .py 文件,因此需要将请求传递到 python 运行时,并说明要运行什么文件以及在哪里返回该文件的输出。这是 mod_python 的作用——从服务器获取请求并将它们交给运行时。大多数 mod 还处理线程池 - 假设您在一分钟内有 20 个请求,如果每个请求都以简单的方式传递给 python 运行时,那么您将有 20 个 python 线程全部启动,一起运行,然后随着进程完成而死亡.通常,Apache mods 会保持一些线程启动并运行,以节省启动时间并将新请求传递给现有线程之一,以便当它完成一个请求时,它会通过接口传递另一个请求。 CGI 容器以稍微不同的方式完成相同的工作,您可能会选择其中一个的原因可能与您使用的 HTTP 服务器有关(例如,mod_python 是为 Apache 设计的,例如,FastCGI 之类的东西更多地用于LightHttpd ) 和性能考虑。如果您使用的是 FastCGI 之类的东西,那么您可能需要在 CGI 容器和编程语言运行时之间建立第二层接口。

所以你正在使用的图层看起来有点像这样:

HTTP Server->  CGI Layer          ->  Programming Language Runtime -> your code
Apache     ->  mod_python         ->  Python Runtime               -> index.py
LightHttpd ->  FastCGI+python_cgi ->  Python Runtime               -> index.py 

显然,我在这里使用了 Python 作为示例,但是您可以找到大多数主流语言(以及许多深奥的语言)的等效模块和 cgi 容器,并且在大多数情况下,您使用的 Http 堆栈大致相似.

【讨论】:

  • 非常感谢,这绝对有助于清理一些事情:-)
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2011-08-27
  • 2011-03-03
  • 1970-01-01
  • 2011-01-29
  • 2013-10-07
  • 2014-02-11
相关资源
最近更新 更多