使用PHP作为“前端”,编写Haskell网络应用程序

5
在Haskell Web开发领域中,已经发生了很多重大的事情,其中一些可用的框架(如Yesod和Snap服务器)似乎相当成熟。然而,学习曲线可能有点陡峭,也许构建Web应用程序不能完全被认为是Haskell的长处。
另一个我提出的SO问题的答案表明,在Haskell中编写PHP扩展应该是可能的。事实上,我目前正在尝试将一个小的Haskell程序转换为PHP扩展作为概念验证。
因此,问题是 - 是否有必要创建一个Haskell Web框架,旨在作为PHP扩展运行,并将所有请求/响应/ cookie等处理留给PHP
创建这样一个框架涉及哪些设计决策?现在,我唯一能想到的是,它可能会公开一个XML / JSON API,可通过GET和SET函数调用由PHP页面访问。

具体针对PHP,我有所怀疑,这只是基于文化方面的考虑。但是可能会有一些中间件最终可以与PHP配合使用。 - luqui
使用Happstack或Snap服务器的基本Web方法的学习曲线是最低的。只有当你使用snap或yesod提供的各种用于较大网站的脚手架、持久化方法和偏好的模板系统时,复杂性才会增加。如果你忽略这些内容(使用yesod并不容易,但使用happstack或snap甚至只使用fastcgi非常简单),那么PHP就没有任何优势。 - sclv
@sclv:嗯?Yesod 有什么难的吗?我做了一些玩具应用程序来尝试它,即使不知道自己在做什么,开始起来似乎非常容易。也没有感觉到它有任何比如 Rails 更多的黑盒子充满黑魔法。诚然,我没有走得很远,也没有在持久性方面做太多事情,所以可能在某些时候会变得更加棘手?更好的文档会很好,但我想这是一个正在进行中的工作。 - C. A. McCann
@camcann -- 我同意,Yesod并不比Rails更神奇。但是David Blaine也不是。我认为例如类型安全路径、Hamlet等并不是非常难。它们只是与人们习惯的不同。因此,“最小”网站的前期工作涉及一定的学习曲线,只有在更大的网站上才能看到回报。但这不是Haskell的问题--Python或其他任何框架也是如此。我上周看了一下Pylons文档,发现它完全难以理解。 - sclv
@sclv: 我想是这样的。在我看来,Yesod 中大部分困难的东西都可以在不太理解的情况下广泛使用,从而推迟学习曲线。显然,我对 Haskell 有一般的了解,并且 Web 开发是我的谋生手段,但我仍然完全不知道 Yesod 的内部工作原理。然而,通过粗略模仿我在其他地方看到的示例,我已经成功地完成了一些小网站。 - C. A. McCann
1个回答

11

我想不出任何使用情形使得这个方案有任何意义。如果你想让其他东西处理HTTP请求/响应,直接编写到Apache API中会更好。

引入PHP可以提供参数解析和Cookie管理,但也引入了许多其他的问题。许多常见做法非常不安全或不可靠,而且你只能生成内容--如果你想根据URL转发到其他代码部分,你必须自己编写所有的代码。许多成熟的PHP程序最终只有一个“开始”PHP脚本。此外,如果你想对上传的文件进行任何有趣的操作,你也会遇到问题,因为PHP以一种次优的方式处理它们。

尽管你理论上可以在Haskell扩展中实现非常计算密集的任务,但在这种情况下你可能会更好地编写C扩展程序,因为PHP调用从来不应该长时间挂起。

看起来你将自己局限于PHP在Web应用程序中的愚蠢模型,只是为了获取简单的参数和标头解析功能。

编写一个Haskell接口到Apache API可能会释放你的手脚。你可以依赖经过考验的Web服务器,还可以钩入Apache请求周期的每个阶段。Apache的预分派和定期杀死子进程的方式可能是处理Haskell空间泄漏的一种方式,虽然这是一种“大棒”方法。


1
此外,如果您使用FCGI,您可以轻松地为nginx或LigHttpd创建一个模块。当您需要部署高负载应用程序并且不需要Apache的所有重型功能时,这两个选项可能是更好的选择。 - Alessandro Vermeulen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接