How to use the PHP built-in web server
PHP has come with a built-in web server since version 5.4. I was a bit late to the party as I only became properly aware of it a couple of years ago.
It is definitely not something to be used in a production environment but it can be used for testing and development.
I use it a lot. This blog is driven by my own software, which is vaguely Jekyll-like in that it generates a static website, but it’s written in PHP. For production purposes I upload the site to an Apache web server but I test things out on my MacBook via PHP’s built-in server.
I call up an instance of the server after I’ve built my site, assuming there are no errors in the build. I use PHP’s exec
function to do so as follows:
exec("php -S 0.0.0.0:8080 -t /Path/To/Site router.php");
Where:
0.0.0.0
simply means the local machine,8080
is the port to serve the site on (pick a port that suits you),/Path/To/Site
is the directory on your local machine where your website is,router.php
is a file in the root of/Path/To/Site
that will route the web requests (more on that below).
You can then access the site by going to http://0.0.0.0:8080
in a browser.
I have router.php
set up as follows:
$rawpath = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$ext = pathinfo($rawpath, PATHINFO_EXTENSION);
if (empty($ext)) {
$path = rtrim($rawpath, "/") . "/index.html";
if (file_exists($_SERVER["DOCUMENT_ROOT"] . $path)) {
return false;
}
$path = $rawpath . ".html";
if (file_exists($_SERVER["DOCUMENT_ROOT"] . $path)) {
include $_SERVER["DOCUMENT_ROOT"] . $path;
return true;
}
}
return false;
This just parses the request, adds an extension to the file name (because I use ‘pretty’ URLs in my code), checks the file exists and, if so, serves it up via an include.
You could of course add a lot more code to router.php
to perform checks on file extensions or whatever, but the above code works fine for my purposes. I’m not bothered about anything too fancy, I just want to check articles or code changes before putting them live.
I find PHP’s built-in web server very useful indeed. Previously I’d have had to install a local Apache (or some other flavour of) web server via a MAMP stack or whatever.
You can read more about PHP’s built-in web server via the PHP documentation.