【问题标题】:Ruby cgi needs to reload apache for new value?Ruby cgi 需要重新加载 apache 以获得新值?
【发布时间】:2014-12-12 06:55:47
【问题描述】:

我在 Ubuntu 上安装了带有 apache 的 phusion-passenger。在我的 config.ru 中,我有以下代码:

require 'cgi'

$tpl = CGI.new['myvar'] + '.rb'

app = proc do |env|
    [200, { "Content-Type" => "text/html" }, [$tpl]]
end
run app

然后,当我打开浏览器http://localhost/?myvar=hello 时,我看到打印出了hello 这个词,这很好。然后我把url改成http://localhost/?myvar=world,但是页面还是显示hello。只有在我重新加载 apache 后,页面才会显示 world

在使用 phusion-passenger 之前,我将 mod_ruby 与 apache 一起使用。如果我没记错的话,我不需要重新启动 apache 来获取 CGI 变量来打印更新的值。

我不拘泥于需要使用 CGI。我只是希望能够抓取查询字符串参数,而不必每次都重新加载 apache。

我没有使用 rails 或 Sinatra,因为我只是想了解一下 Ruby 语言以及 apache 的 phusion-passenger 是什么。

【问题讨论】:

  • “我没有使用 Rails 或 Sinatra,因为我只是想了解一下 Ruby 语言以及 apache 的 phusion-passenger 是什么。”那你真的会走上一条艰难的道路。我们很少使用 Rack,我们使用 Sinatra、Padrino 或 Rails,并将 Rack 视为最简单的事情的不可见层,当我们需要处理 HTTPd 和控制层之间的数据流时,Rack 会很有用。 Ruby 不是 Rack,Rack 是 HTTPd 和 Ruby 控制层之间的中间件,比如 Sinatra。

标签: ruby cgi passenger


【解决方案1】:

IMO 这种行为是有道理的。因为$tpl 只在文件加载时设置一次,所以当第一个请求被处理时会发生什么。之后 - 在后续请求中 - 仅调用 proc,但这不会再更改 $tpl

我不会使用普通的CGI,而是使用非常简单的Rack 应用:

require 'rack'
require 'rack/server'

class Server
  def self.call(env)
    req = Rack::Request.new(env)
    tpl = "#{req.params['myvar']}.rb"
    [200, {}, [tpl]]
  end
end

run Server

【讨论】:

  • 好的,谢谢。我刚才一直在 proc 中尝试,但它仍然保留了我第一次加载页面时的值。你能想到其他的想法吗?最后,我的目标是每次通过 url 将不同的变量传递给我的 ruby​​ 脚本
  • 我更新了我的答案。我的第一个解决方案没有解决问题。它只是将它移到另一行,因为proc 在服务器启动时也已定义。
  • 我刚刚尝试了您的代码的 lambda 版本,但仍然是同样的问题。我真的需要学习机架吗?只是想让 Sinatra 工作,我不知所措......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多