Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using WEBrick to serve PHP web applications

Tags:

php

ruby

webrick

I am a PHP developer who has started learning Ruby on Rails. I love how easy it is to get up and running developing Rails applications. One of the things I love most is WEBrick. It makes it so you don't have to configure Apache and Virtual Hosts for every little project you are working on. WEBrick allows you to easily start up and shut down a server so you can click around your web application.

I don't always have the luxury of working on a Ruby on Rails app, so I was wondering how I might configure (or modify) WEBrick to be able to use it to serve up my PHP projects and Zend Framework applications.

Have you attempted this? What would be the necessary steps in order to achieve this?

like image 798
Andrew Avatar asked Mar 25 '11 20:03

Andrew


2 Answers

To get php support in webrick you can use a handler for php files. To do this you have to extend HttpServlet::AbstractServlet and implement the do_GET and do_POST methods. These methods are called for GET and POST requests from a browser. There you just have to feed the incoming request to php-cgi.

To get the PHPHandler to handle php files you have to add it to the HandlerTable of a specific mount. You can do it like this:

s = HTTPServer.new(
    :Port => port,
    :DocumentRoot => dir,
    :PHPPath => phppath
)
s.mount("/", HTTPServlet::FileHandler, dir, 
    {:FancyIndexing => true, :HandlerTable => {"php" => HTTPServlet::PHPHandler}})

The first statement initializes the server. The second adds options to the DocumentRoot mount. Here it enables directory listings and handling php files with PHPHandler. After that the server can be started with s.start().

I have written a PHPHandler myself as I haven't found one somewhere else. It is based on webricks CGIHandler, but reworked to get it working with php-cgi. You can have a look at the PHPHandler on GitHub:

https://github.com/questmaster/WEBrickPHPHandler

like image 196
Questmaster Avatar answered Nov 11 '22 23:11

Questmaster


You can use nginx or lighttpd

Here's a minimal lighttpd config.

  1. Install PHP with FastCGI support and adjust the "bin-path" option below for your system. You can install it with MacPorts using sudo port install php5 +fastcgi
  2. Name this file lighttpd.conf
  3. then simply run lighttpd -f lighttpd.conf from any directory you'd like to serve.
  4. Open your webbrowser to localhost:8000

lighttpd.conf:

server.bind = "0.0.0.0"
server.port = 8000
server.document-root = CWD
server.errorlog          = CWD + "/lighttpd.error.log"
accesslog.filename       = CWD + "/lighttpd.access.log"

index-file.names = ( "index.php", "index.html",
                    "index.htm", "default.htm" )

server.modules = ("mod_fastcgi", "mod_accesslog")

fastcgi.server = ( ".php" => (( 
  "bin-path" => "/opt/local/bin/php-cgi",
  "socket" => CWD + "/php5.socket",
)))

mimetype.assign = (  
  ".css"        =>  "text/css",
  ".gif"        =>  "image/gif",
  ".htm"        =>  "text/html",
  ".html"       =>  "text/html",
  ".jpeg"       =>  "image/jpeg",
  ".jpg"        =>  "image/jpeg",
  ".js"         =>  "text/javascript",
  ".png"        =>  "image/png",
  ".swf"        =>  "application/x-shockwave-flash",
  ".txt"        =>  "text/plain"
)

# Making sure file uploads above 64k always work when using IE or Safari
# For more information, see http://trac.lighttpd.net/trac/ticket/360
$HTTP["useragent"] =~ "^(.*MSIE.*)|(.*AppleWebKit.*)$" {
  server.max-keep-alive-requests = 0
}

If you'd like to use a custom php.ini file, change bin-path to this:

"bin-path" => "/opt/local/bin/php-fcgi -c" + CWD + "/php.ini",

If you'd like to configure nginx to do the same, here's a pointer.

like image 21
John Douthat Avatar answered Nov 12 '22 00:11

John Douthat