【问题标题】:CGI language choiceCGI 语言选择
【发布时间】:2010-12-19 23:00:35
【问题描述】:

好的,我在这里问了一些相关的问题,但最后却提出了更多问题,我现在意识到这是因为我没有足够的背景信息。所以我会让它更通用:

我需要制作一个简单的 Web 应用程序。静态 HTML/JQuery 页面将向某些服务器端代码发送 AJAX POST 请求,这将:

  • 读取传入的POST变量
  • 运行一些非常简单的逻辑
  • 点击 MySQL 数据库进行简单的 CRUD 操作
  • 返回一个纯文本字符串,供页面上的 javascript 使用

我认为 Ruby 是一个很好的选择,因为每个人都在谈论它的设计有多好,而且我一直在使用它 - 不是 RoR,只是 Ruby 用于简单的脚本任务 - 我有点喜欢它。

我的问题是,我对那里的万亿辅助库和框架感到非常困惑。我不知道这些是什么,因此如果我需要它们中的任何一个/全部:Rack、Sinatra、Camping、mod_ruby、FastCGI 等。

只学习 PHP 和我们学习会更容易吗?或者我可以将我的 .rb 文件放到 cgi-bin 文件夹中(我使用 Apache 进行托管)并使用 ruby​​ cgi 库来获取我的变量吗?

编辑:就 Rails 而言,我只是假设它对我想要的东西来说有点矫枉过正,但我​​可能错了。我看了看,快速生成基于数据的网站似乎很酷,但这不是我想要做的。我不想要用户的任何表单页面。我不希望他们输入数据或查看记录。我什至不想返回任何 HTML。我只想在服务器上放置一个 ruby​​ 脚本,在发布请求中传递一些变量,并返回一个 JSON 字符串作为响应。我需要一些基本的 cookie/会话/状态管理

这在 C# 和 ASP.NET 中使用 web 服务是一件非常容易的事情,但它似乎与开源技术很混淆。

【问题讨论】:

  • Php 非常普遍,更有可能将其预先安装在服务器上,这样您就不必对其进行配置。
  • 是的,或者 PERL。
  • 这在您已经知道的平台上是一件非常容易的事情,但是对于您刚接触的平台来说似乎很混乱。 :-)

标签: mysql ruby web-services cgi


【解决方案1】:

您不想使用成熟框架中的任何功能,所以不要使用任何功能。更少的代码 = 更少的错误 = 更少的安全噩梦。

CGI

与其他方法相比,CGI 有一些性能缺陷,但(在我看来)仍然是最简单和最容易使用的一种方法。这是您使用内置 cgi 库的方式:

require "cgi"
cgi= CGI.new

answer= evaluate(cgi.params)

cgi.out do
    answer
end

机架

另一个易于使用的低技术变体是机架。 Rack 是一个抽象层,适用于许多网络服务器接口(cgi、fastcgi、webrick 等)。它的简单性可以与仅使用 cgi 的简单性相提并论。将以下内容放入以 .ru 结尾的文件中,放入您的 cgi 目录中。

#!/usr/bin/rackup
require "rack/request"

run (lambda do |env|
  request= Rack::Request(env)

  anwser= evaluate(request.params)

  return [200, {}, answer]
end)

这似乎与 cgi 没有太大区别,但它为您提供了更多的可能性。如果您在本地机器上执行此文件,rackup 将启动 webrick 网络服务器。该网络服务器将提供您在 .ru 文件中描述的网页。

其他接口

快速 cgi

fast-cgi 的工作方式几乎与 CGI 类似。不同之处在于,在 CGI 中,您的脚本会针对它必须处理的每个请求启动。使用 fast-cgi,您的脚本只针对所有请求启动一次。有一个库可用于在 ruby​​ 中编写 fast-cgi 脚本。

mod_ruby

​​>

mod_ruby 是 apache 的内置 ruby​​ 解释器。它的工作原理类似于 apache 中的 mod_php。

杂种

mongrel 是 ruby​​ 应用程序的独立网络服务器。这是一个简单的 hello world 示例。

require 'mongrel'

class SimpleHandler < Mongrel::HttpHandler
   def process(request, response)
     response.start(200) do |head,out|
       head["Content-Type"] = "text/plain"
       out.write("hello world!\n")
     end
   end
end

h = Mongrel::HttpServer.new("0.0.0.0", "3000")
h.register("/hello", SimpleHandler.new)
h.run.join

Mongrel 通常用于 Rails 和其他 Ruby 框架。大多数人在端口 80 上使用 apache 或其他东西。该网络服务器将请求分发到在其他端口上运行的多个混合服务器。我认为这完全满足您的需求。

phusion 乘客

passenger 也称为 mod_rails 或 mod_rack。它是 apache 和 nginx 的一个模块,用于托管 rails 和 rack 应用程序。根据他们的网站,载客轨道比单独使用轨道少 1/3 的 ram。如果你为 rack 编写你的软件,你可以通过使用乘客来加快速度,而不是 cgi 或 fast-cgi。

【讨论】:

  • 谢谢,看来我要走 CGI 路线了。您能否扩展 fcgi/passenger/mongrel 之间的区别?我的应用程序非常基本,只运行几十行代码,执行一些 mysql crud 语句并返回一些 json 字符串。我应该如何托管它?
  • 哇,感谢您提供的所有细节。尽管我很喜欢整个 LAMP 的想法,但似乎真的没有一个很好的资源来详细说明和比较所有这些相关技术。我读到的关于 ruby​​ 的书只提到了 Webrick。由于设置简单,我想我现在将采用 Fast-CGI 路线。再次感谢!
【解决方案2】:

使用 jQuery 和 PHP。

这两种技术都有很好的文档记录,您应该能够在几个小时内启动并运行应用程序。你听起来好像你知道一两件事——谈论 CRUD 操作等等——所以我不会用例子让你厌烦。就 JSON 而言,可能有一百万个 PHP 库用于输出 JSON 对象。

【讨论】:

    【解决方案3】:

    Sinatra 非常易于学习和使用。使用 Phusion Passenger 也很容易部署(类似于 Rails 和 Sinatra 等 ruby​​ 框架的 mod_php)。此处说明:http://blog.squarefour.net/2009/03/06/deploying-sinatra-on-passenger/

    如果你发现你需要的比 Sinatra 给你的更多,我推荐 Rails。由于几乎不需要任何配置,因此使用Passenger 进行设置更加容易。 (参见 modrails.com)。

    【讨论】:

    • 好的,但我还是不明白。 Sinatra 和Passenger 给我的是什么?我将 ruby​​ 文件放到 apache 上的 cgi-bin 中,当我从另一个网页点击它时它就会运行。 Rack/Passenger/Sinatra 到底在为我做什么?
    【解决方案4】:

    PHP 非常易于使用,因为它是专门为这类事情而设计的。想要读取 POST 变量?他们在 $_POST 中。想查询MySQL? mysql_query("SELECT `something` FROM `table`");.如果您需要帮助,Google 搜索“php what_you_need_to_do”几乎总是会在 php.net 上返回结果,这非常有帮助。

    对于您正在做的事情,您不需要任何额外的框架。

    【讨论】:

    • 是的,我喜欢 Ruby 语法,但它似乎不像 PHP 那样井井有条。是会话管理。用 PHP 容易吗?
    • PHP 对于所有事情来说确实是一门糟糕的语言。 Ruby 比 PHP 组织得更好,但是逻辑上 Ruby 的会话管理会更加困难,因为会话实际上仅用于模拟 REST 中的状态...... Ruby 还有其他用途。 Ruby 是一种更丰富的语言,PHP 就像一个包含 1400 个名字的电话簿,语法同样简单。 ... PS,如果您使用 mysql_query 的“简单性”,请不要忘记明确必须为所有用户输入使用 mysql_real_escape_string 所增加的复杂性。
    • 我同意几乎所有语言都比一般的 PHP“更好”,但是如果你要制作一个像你描述的那样简单的页面,那么任何其他语言都是矫枉过正的.最重要的是 PHP 有非常好的文档。
    • 哦,会话很简单,只需调用 session_start();然后访问 $_SESSION 变量($_SESSION['x'] = 'some string'; or $x = $_SESSION['x'])。
    【解决方案5】:

    我很好奇我认为您拒绝尝试 Rails 的原因。你说你想“花更多的时间在脚本本身上,而不是花在配置上”,但你似乎对 Rails 不屑一顾。 Rails 是关于约定优于配置的。如果您花时间了解 Rails 的工作方式,只需遵循框架的约定,您就可以“免费”获得数量惊人的功能。

    如果你想制作一个简单的 web 应用程序,Rails 确实是一种非常轻松且很好的开始方式。您可以使用 sqlite 数据库,甚至不用与 MySQL 混淆(不会扩展,但对于学习或简单的应用程序来说很好)。确实有更简单的框架,但是由于您似乎对 Web 编程很陌生,我建议您从文档和知识渊博的人方面获得最大支持的开始。遵循古老的格言:先让它工作,然后再优化。

    我能看到的唯一症结是 Apache 集成......这些天关于 Rails 部署的共识似乎集中在使用轻量级 httpds 代替 Apache。有一个 mod_fcgid 似乎是使用 Apache 的最佳方式(mod_ruby 已被弃用,错误且缓慢,最后我读到)如果您可以进行自定义 mods。或者有 Phusion Passenger,这似乎是最新和最好的方法。由于为每个请求执行解释器+框架的开销,在标准 CGI 环境中运行 Rails 会产生糟糕的性能(但这适用于任何 CGI 框架,真的)。如果您使用将解释器+框架保留在内存中的东西,您将获得更好的性能。

    【讨论】:

    • 我不认为 mod_ruby 很慢,它只是不适合构建 Web 应用程序。 mod_ruby 用于使用 Ruby 扩展 Apache,但对于所有 mod_* 都是如此。由于它们的架构,它们通常更快,但它们以一种非常糟糕的方式模糊了关注点。
    【解决方案6】:

    我个人喜欢 Django。我在使用 Ruby on Rails 时遇到了一个问题,当我只想做一些简单的事情时,我对所有事情都感到不知所措,这听起来像是你想做的事情(因为你说 ROR 感觉有点矫枉过正)。我在 Django 中发现的很酷的一点是,如果你想要所有东西,那么你可以通过插入它来获得所有东西……但如果你想要的更少,那么你就不用插入该技术,它就更轻量级了。

    以“视图”为例。 Django 和 ROR 一样,使用 MVC。但是如果你只是想返回一串数据并且不需要视图,那么你不需要插入视图。但是,如果稍后您决定将其在视图中更有条理,那么您可以轻松地将其插入。

    这是他们的网站:http://www.djangoproject.com/

    【讨论】:

    • 顺便说一句,我会远离 PHP,因为每当我过去处理它时,随着项目变得越来越大,它变得非常难以保持井井有条。但你可能会更成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-09-14
    • 2012-01-03
    • 2023-03-05
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多