我在使用WEBrick server的浏览器中运行程序时遇到问题。它向我展示了我在2loop.rb文件中编写的代码。
当我在命令提示符下运行ruby -run -e -httpd. -p 5000
并在浏览器中加载http://localhost:5000/2loop.rb
时,它会显示来自2loop.rb的代码,而不是运行它。
如何执行2loop.rb程序?
答案 0 :(得分:2)
您可以通过将当前工作目录作为Web服务器的根目录来自行完成此操作。您实际上并未在文件中运行代码;您只是告诉WEBrick提供您在URI中命名的任何文件。 http://localhost:5000/2loop.rb
将提供" 2loop.rb"在您发布的示例中作为text / html。
您正在使用的旗帜实际上并未运行。"相反,-r
标志实际上加载了一个模块,在本例中是un.rb模块。使用un.rb启动WEBrick是这样的:
$ ruby -run -e httpd . -p 5000
并在文档根目录中启动Web服务器。在这种情况下,点表示使用当前工作目录作为根。这并不是你想要开始放在Ruby文件中的代码。
使用WEBrick documentation中的一些代码段,您将看到可以创建名为" 2loop.rb"的文件。包含以下内容:
#!/usr/bin/env ruby
require 'webrick'
root = File.path '/tmp/public_html'
server = WEBrick::HTTPServer.new :Port => 5000, :DocumentRoot => root
trap 'INT' do server.shutdown end
server.start
这将从端口5000上的/ tmp / public_html目录中提供文件,您可以在http://localhost:5000
找到该文件。然后,您可以使文件可执行并使用./2loop.rb
启动服务器,或者如果您因某些原因不想让文件可执行,则只需运行ruby 2loop.rb
。
如果您不想让WEBrick只提供文件,您必须{2}到2loop.rb脚本内的Web服务器。这是一个相当低级的事情,但可能适合您的需求。
如果您不想自己编写所有低级别行为,则应该使用add custom behavior或Ruby on Rails等网络框架。 Sinatra尤其是一种非常轻量级的替代品。这个例子:
#!/usr/bin/env ruby
require 'sinatra'
set :port, 5000
get '/hello' do
"Hello, World!"
end
将在http://localhost:5000/hello
创建一个网址,其中的自定义操作会返回" Hello,World!"作为浏览器内的回应。
答案 1 :(得分:1)
好吧,我建议你使用Common Gateway Interface (CGI)。让我举个例子。
首先,创建一个名为server.rb
的文件:
require 'webrick'
server = WEBrick::HTTPServer.new(
:Port => 6789, # a server's port
:DocumentRoot => File.join(Dir.pwd, "/scripts") # a folder with scripts
)
server.start
其次,创建一个文件夹scripts
并将以下文件(the_best_program.cgi
)放入其中。请注意.cgi
扩展名。这很重要。如果您在Windows下工作,请查看here以获取有关脚本第一行(shebang)的详细信息。
#!/usr/bin/env ruby
require 'cgi'
print "Content-type: text/plain\n\n"
5.times { |i| puts "Hello world #{i}!"}
puts 'So many worlds there. :('
<强>最后强>,
ruby server.rb
)启动服务器。localhost:6789/the_best_program.cgi
(或0.0.0.0:6789/the_best_program.cgi
)chmod 755 scripts scripts/the_best_program.cgi
。