One of my clients asked me to monitor her site’s uptime.

While this script is not yet complete, and it should use a CRON job and a mail() function, here’s how to check for uptime and current HTTP status code:

<?php
$toCheckURL = 'http://getbutterfly.com/'; // The domain name of the site you want to check

// This all sets up the CURL actions to check the page
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $toCheckURL);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); //follow up to 10 redirections - avoids loops
$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Get the HTTP Code

// Get final redirected URL, will be the same if URL is not redirected
$new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
curl_close($ch);

// Array of HTTP status codes. Trim down if you would like to.
$codes = array(
	0 => 'Domain Not Found',
	100 => 'Continue',
	101 => 'Switching Protocols',
	200 => 'OK',
	201 => 'Created',
	202 => 'Accepted',
	203 => 'Non-Authoritative Information',
	204 => 'No Content',
	205 => 'Reset Content',
	206 => 'Partial Content',
	300 => 'Multiple Choices',
	301 => 'Moved Permanently',
	302 => 'Found',
	303 => 'See Other',
	304 => 'Not Modified',
	305 => 'Use Proxy',
	307 => 'Temporary Redirect',
	400 => 'Bad Request',
	401 => 'Unauthorized',
	402 => 'Payment Required',
	403 => 'Forbidden',
	404 => 'Not Found',
	405 => 'Method Not Allowed',
	406 => 'Not Acceptable',
	407 => 'Proxy Authentication Required',
	408 => 'Request Timeout',
	409 => 'Conflict',
	410 => 'Gone',
	411 => 'Length Required',
	412 => 'Precondition Failed',
	413 => 'Request Entity Too Large',
	414 => 'Request-URI Too Long',
	415 => 'Unsupported Media Type',
	416 => 'Requested Range Not Satisfiable',
	417 => 'Expectation Failed',
	500 => 'Internal Server Error',
	501 => 'Not Implemented',
	502 => 'Bad Gateway',
	503 => 'Service Unavailable',
	504 => 'Gateway Timeout',
	505 => 'HTTP Version Not Supported'
);

// Check if we have a valid HTTP code from the above list
if(isset($codes[$http_code])) {
	echo 'Website returned status code: ' . $http_code . ' - ' . $codes[$http_code] . '<br>';
	// Get the headers from the $data to the $matches variable
	preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/", $data, $matches);
	array_pop($matches[1]); // Remove the last status that we just displayed above which should be 200
	if(count($matches[1]) > 0) {
		// Loop through all other matches to see what other status codes we got
		foreach ($matches[1] as $c) {
			echo $c . ' - ' . $codes[$c] . '<br>';
		}
	}
	// Can use this to check if the URL is still the same as you checked
	// Or if the server has moved
	if($toCheckURL != $new_url) {
		echo 'URL has changed to: ' . $new_url;
	}
}

// This is just to show you the headers of the website you are checking
echo '<hr><pre>';
	var_dump($data);
echo '</pre>';
?>

Further steps would involve adding the data to a database and creating charts and graphs. Easier said than done :)

Maybe I’ll make this my next project.


Read our comment policy before commenting! Comments such as "Thank you!", "Awesome!", "You're the man!" are either marked as spam or stripped from URL.


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>