2016-05-07 3 views
0

PHPにはルータファイルを引数として渡すことができるwebserver(例#3)が組み込まれています。すべてのリクエストは、ルーターファイルを通過します。そこでは、リクエストであらゆる種類のことを実行できます。Rubyウェブサーバのルータファイル

php -S localhost:8000 router.php 

ルーターファイルは、次のようになります。

<?php 
// router.php 
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) { 
    return false; // serve the requested resource as-is. 
} else { 
    echo "<p>Welcome to PHP</p>"; 
} 
?> 

が薄いようなRubyのWebサーバであることも可能ですか?

ありがとうございます!

答えて

2

これは、ルビーの非常に軽量なWebフレームワークであるsinatraとよく似ています。

require 'sinatra' 
get "/" do 
    "hello world" 
end 
get "/:foo" do 
    "you typed #{params[:foo]}" 
end 

をし、端末に:

は例えば、ルビーファイルに(それがserver.rbと呼ばれていますと言う)

ruby server.rb 
# => listening on port 4567 

あなたは、ブラウザでlocalhost:4567に行くことによってそれをテストすることができます。

+0

はええ、私はシナトラについて知っています。しかし、私が達成しようとしているのは、これらすべての要求をキャッチし、URIに基づいてRackアプリケーションを動的に実行したいということです。 Sinatraはウェブにとって最高ですが、私はこの特定の作業にSinatraを使用することは賢明ではないと思います。 –

+0

@FrankLeveringシェルコマンドをディッシングすることを除いて、Rackアプリケーションを "動的に"実行することについてはわかりません。あなたは[rack docs](http://rack.github.io/)を見ましたか?賢明ではない、ちょうど私が思うような考えを投げていると言っている。私はあなたが "直接アプリケーションを扱う"例を使用し、そのファイルにいくつかのsinatraルートを追加できるのだろうか? –

+0

@FrankLevering特定のエンドポイントでラックアプリケーションを「マウント」することもできます。 [multiple-sinatra-apps-using-rack-mount](http://stackoverflow.com/questions/6496433/multiple-sinatra-apps-using-rack-mount)を参照してください。 –

1

私は、ラックを使用するあなたのケースでは、これはルビーです:

  1. ラックは、これらすべてのWebアプリケーションサーバ(WEBrickに、Mongrelのなど)へのラックを接続ハンドラを含んでいます。
  2. Rackには、RackをさまざまなWebフレームワーク(Sinatra、Railsなど)に接続するアダプタが含まれています。
  3. サーバーとフレームワークの間で、ミックウェアを使用してアプリケーションのニーズに合わせてRackをカスタマイズできます。

使用するためには、ラックあなたは、ラックのアプリケーションを作成する必要があります。

  1. は、callメソッドを答えなければなりません。
  2. コールmehtodはサーバによって呼び出され、CGI情報でenv変数を受信する必要があります。 A)ステータス :整数 B)ヘッダ:ハッシュ C)体:それぞれに応答して、それぞれのすべての呼び出しの文字列をretunsオブジェクト
  3. は、3つの要素を持つ配列を返さなければなりません。

Rackミドルウェアの基本的な考え方は、呼び出し元のクライアントとサーバーの間にあり、サーバーに送信する前にHTTP要求を処理し、クライアントに返す前にHTTP応答を処理することです。

これはあなたの質問の基本的な、答えは:

test_rack.rb 

class MyApp 
    def call env 
     [200, {"Content-Type" => "text/html"}, ["Hello Rack Participants"]] 
    end 
end 

config.ru 

require './test_rack.rb' 
run MyApp.new 

、アプリケーションを起動して、ローカルホストへの呼び出しします:9292 /何

╭─[email protected] ~/learn/ruby/stackoverflow/scripting ‹[email protected]› ‹1.7› ‹SBCL 1.3.5› 
╰─$ rackup config.ru 
[2016-05-08 11:17:41] INFO WEBrick 1.3.1 
[2016-05-08 11:17:41] INFO ruby 2.2.3 (2015-08-18) [x86_64-darwin15] 
[2016-05-08 11:17:41] INFO WEBrick::HTTPServer#start: pid=2610 port=9292 
::1 - - [08/May/2016:11:18:04 +0200] "GET /patata HTTP/1.1" 200 - 0.0010 
::1 - - [08/May/2016:11:18:04 +0200] "GET /favicon.ico HTTP/1.1" 200 - 0.0005 
::1 - - [08/May/2016:11:18:09 +0200] "GET /patata/calimero HTTP/1.1" 200 - 0.0003 

はのは、コンソールでの作業ラックを見てみましょう、複数のWebサーバを参照して、呼び出し関数を作成するためのラムダを渡す

require 'rack' 
=> true 
irb(main):010:0> Rack::Handler::constants 
=> [:CGI, :FastCGI, :Mongrel, :EventedMongrel, :SwiftipliedMongrel, :WEBrick, :LSWS, :SCGI, :Thin] 
irb(main):026:0> Rack::Handler::WEBrick.run lambda { |env| [200,{"Content-Type" => "text/plain"}, ["Hello. The time is #{Time.now}"]] } 
[2016-05-08 11:22:39] INFO WEBrick 1.3.1 
[2016-05-08 11:22:39] INFO ruby 2.2.3 (2015-08-18) [x86_64-darwin15] 
[2016-05-08 11:22:39] INFO WEBrick::HTTPServer#start: pid=1798 port=8080 

〜gさらにO:

https://blog.engineyard.com/2015/understanding-rack-apps-and-middleware

https://github.com/rack/rack

関連する問題