PHPHandler

ちょっとした PHP のテストのための httpdRuby で作ってみたわけですよ

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 を付けないで実行できます
リクエストがこのハンドラを通り抜ける度にリフレクションで特異メソッドを定義したりしてるわけで性能的にはどうかわからんけどまぁそんな感じ
こんな感じで環境変数が設定されるようにしないと PHPCGI インタフェースにセキュリティ上の理由で実行を拒否されちゃうわけです詳細はこのへん → http://php.net/manual/ja/security.cgi-bin.force-redirect.php
環境変数CGI として実行中かそうでないかを判別してるので、普通にコマンドとして実行すると実行できてしまったりとか(詳細は cgi_main.c の中に)けっこう謎い感じだったり

ECONNRESET

close 時に Connection reset by peer になることがあるのって FreeBSD 固有のふるまいだったのか → http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/41778
確実な再現方法がうまく見つけられなくてちょっと悩んでたんだけど、このパッチが通れば ruby では忘れてしまってよい問題になるわけだ