Handling HTTP Requests in PHP

In PHP, you usually use a separate web server program that accepts HTTP requests and passes them to PHP to create a response. Common examples of separate web server programs are Apache and Nginx. However, PHP has a built in web server we can use during development.

To use the development web server, open a terminal and a new folder for holding your code. Create a file called index.php and put this PHP code in it:


echo 'Hello World!';

Go back to your terminal and start a PHP web server using this command:

php -S localhost:8080

Now, you can open localhost:8080 in your web browser and you will see ‘Hello World!’ in the content of the page.

Next, we can use PHP to analyze all the information about the HTTP request sent from the browser to your PHP script. Change your index.php to have this code:


$protocol = $_SERVER['SERVER_PROTOCOL'];
$headers = getallheaders();

echo "$method $uri $protocol <br/>";
foreach ($headers as $key => $header) {
    echo "$key: $header <br/>";

Reload localhost:8080 and you will see the main request line and all of the headers printed on the web page. The <br/> tag is HTML for a new line. Since we are outputting to a web browser, we can no longer use "\n" to create a new line.

By default, PHP will generate the necessary response line and headers. If you open your browser console and open the network tab, you can see the response code and headers.

HTTP/1.1 200 OK
Host: localhost:8080
Date: Sun, 28 Apr 2019 10:19:25 -0500
Connection: close
X-Powered-By: PHP/7.2.17
Content-type: text/html; charset=UTF-8

PHP set the response code to 200 OK and the content type to text/html. Even though PHP will output good defaults, we can change them in our code if we want. Update your index.php file with this code:


header('Content-Type: text/plain');

echo "Not Found!";

We are changing the status code to 404 Not Found and the content type to plain text. If you open localhost:8080 in your browser, you will now see this HTTP response in your console:

HTTP/1.1 404 Not Found
Host: localhost:8080
Date: Sun, 28 Apr 2019 10:26:40 -0500
Connection: close
X-Powered-By: PHP/7.2.17
Content-type: text/plain;charset=UTF-8

PHP added the other necessary headers for the response, but this time used 404 in the main response line and set the Content-type header to text/plain.