PHPHandler
ちょっとした PHP のテストのための httpd を Ruby で作ってみたわけですよ
require "webrick/httpserver" class PHPHandler < WEBrick::HTTPServlet::CGIHandler def initialize *args super @cgicmd = "#{CGIRunner} \"/usr/local/bin/php-cgi\"" end def do_GET req, res req.instance_eval { alias orig_meta_vars meta_vars def meta_vars meta = orig_meta_vars meta["REDIRECT_STATUS"] = "200" meta end } super end alias do_POST do_GET end handler_table = { "php" => PHPHandler } document_root_options = { :HandlerTable => handler_table } server = WEBrick::HTTPServer.new :Port => 8080, :BindAddress => "::1" server.mount "/", WEBrick::HTTPServlet::FileHandler, "public_html", document_root_options trap "INT" do server.shutdown end server.start
スクリプトに shebang を付けないで実行できます
リクエストがこのハンドラを通り抜ける度にリフレクションで特異メソッドを定義したりしてるわけで性能的にはどうかわからんけどまぁそんな感じ
こんな感じで環境変数が設定されるようにしないと PHP の CGI インタフェースにセキュリティ上の理由で実行を拒否されちゃうわけです詳細はこのへん → http://php.net/manual/ja/security.cgi-bin.force-redirect.php
環境変数で CGI として実行中かそうでないかを判別してるので、普通にコマンドとして実行すると実行できてしまったりとか(詳細は cgi_main.c の中に)けっこう謎い感じだったり