Linux uptime

If you want to show the uptime of your linux server on your website, you can do so very easily.

<?php
function linuxUptime() {
  $ut = strtok( exec( "cat /proc/uptime" ), "." );
  $days = sprintf( "%2d", ($ut/(3600*24)) );
  $hours = sprintf( "%2d", ( ($ut % (3600*24)) / 3600) );
  $min = sprintf( "%2d", ($ut % (3600*24) % 3600)/60  );
  $sec = sprintf( "%2d", ($ut % (3600*24) % 3600)%60  );
  return array( $days, $hours, $min, $sec );
}

$ut = linuxUptime();
// If you would like to show the seconds as well just add [ , $ut[3] seconds ] after minutes.
echo "Time since last reboot: $ut[0] days, $ut[1] hours, $ut[2] minutes";
?>

Just call the $ut = linuxUptime() function and then you can use the variables to show the time.

**NOTE: Your server must allow you to run the exec() PHP command. Some hosts disable the execution of this and several other PHP functions.

Now if you were wanting to gather the uptime of multiple servers all at the same time this can be accomplished with CURL. What we would end up doing is using the above code and place it in a PHP file on each of the target servers. In the example below you will see I am referencing a file called linuxUptime.php which holds the code listed above. We could then use a MySQL database or just an array full of domain names that we would loop through to gather the stats. Below I am posting a simple script which uses an array as an example. (This file does not currently exist on my site to show uptime of my site)

<?php
$sites = array('danielkassner.com'); // Create a list of sites to check
foreach($sites as $site) { // Loop through each site and get uptime

$ch = curl_init(); // Initiate curl session
curl_setopt($ch, CURLOPT_URL, 'http://'.$site.'/linuxUptime.php'); // Set the URL of the uptime script
curl_setopt($ch, CURLOPT_HEADER, 0); // Disable header output
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // Return data as a string instead of output directly
$data=curl_exec($ch); // Execute curl commands
curl_close ($ch); // Close the curl session

echo $site.': '.$data.'<br />'; // Output value returned from the linuxUptime.php file
} // End server loop
?>

When we gather stats like this we could easily store the uptime values in a database table so that we could track the history.

Enjoy!

Use Curl and PHP to check if website is up or moved

Using the below code you can check to see if a website is up or not. There is an array of various HTTP codes that it can check for. The code will also determine if the website has something like a 301 redirect and then produce the redirected URL. This could be useful for link directories that want to check for URL’s that are no longer active or update their links if the URL has changed. With this code we are just showing the status code and then parsing out all status codes to show later on in the script. The script then compares the URL you are checking vs what the URL that the CURL script ended up on to determine if it was moved. The very last bit of this code is showing you the HTTP headers from the CURL request for viewing purposes only and can be deleted.

<?php
$toCheckURL = "http://www.wlscripting.com/tutorial/67"; // 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 now 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>';
?>

I have commented the code a lot so you should have no trouble modifying the code.

Feature request for Notepad++ Function List plugin

As the number of visitors continues to increase to my Notepad++ Function List for PHP development post I have frequently been asked if this plugin can do a certain task. This task would be to add multiple rules to one main category. So for instance you have a file that has multiple classes located in it and each class has its own set of variables and functions. The Function List plugin allows us to parse these out and find them. However, in its current state we can only link one parsing rule to another.

Example:
Current State:
-Classes
–Training model extends Model
—Functions
—-__construct
—-EventListing
-Class Variables
–$Month
–$Day
–$Year

What we would like:
-Classes
–Training model extends Model
—Class Variables
—-$Month
—-$Day
—-$Year
—Functions
—-__construct
—-EventListing

I have sent an email to the creator of the plugin(Jens Lorenz) about asking the possibility of changing the plugin and that correspondence is listed below:

Sent from Me on March 17, 2010 7:57 AM

I have used the Function List plugin for Notepad++ for some time now and really enjoy it. My question to you is if it would be possible to add multiple subgroups under one group? For instance I am a PHP developer; I have parsing rules for Classes, Class Variables and Functions. I would love to be able to put Class Variables along with the Functions rules under the classes tree. So instead of having:
-Classes
–printer extends resources
—Functions
—-__construct
—-sqlInsert
-Class Variables
–$security
–$db

I would have:
-Classes
–printer extends resources
—Class Variables
—-$security
—-$db
—Functions
—-__construct
—-sqlInsert

I have put up a blog posting of what my current FunctionListRules.xml section looks like at: http://www.danielkassner.com/2010/01/22/using-notepads-function-list-plugin-for-php-development

If you have any ideas that would be great. Thanks!

Sent by Jens Lorenz on March 18, 2010 at 3:27 AM

Hello Daniel,

currently it isn’t possible. Only one level of subgrouping is possible at the moment.

Best Regards
Jens

Sent by me on March 18, 2010 at 7:41 AM

Do you think that this desired functionality will or could be added to a future release? I am sure that it will take some time to accomplish but it would be nice.

Thank you for the quick response.

I did not get a response back from that last email. I wish that I knew more about C++ to modify and send the changes I would make to him for everyone else to enjoy. I am sure he is a busy man just like me which is why I probably did not get a response back.

If you would like to see this feature potentially get added please contact him via email and or post comment here on this posting. You can find his email by opening Notepad++, selecting the Plugins > Function List > Help menu item.

Get user operating system with PHP

Ever wanted to find out what operating system your visitors are using? The following function will allow you to get the user operating system so you can use in a statistics application or show certain content on your website. This will allow server side decisions on what stylesheets to show or any other operating system specific content to be shown/hide.

<?php
/*
Author: Daniel Kassner
Website: http://www.danielkassner.com
*/
function getOS($userAgent) {
  // Create list of operating systems with operating system name as array key 
	$oses = array (
		'iPhone' => '(iPhone)',
		'Windows 3.11' => 'Win16',
		'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)', // Use regular expressions as value to identify operating system
		'Windows 98' => '(Windows 98)|(Win98)',
		'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
		'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
		'Windows 2003' => '(Windows NT 5.2)',
		'Windows Vista' => '(Windows NT 6.0)|(Windows Vista)',
		'Windows 7' => '(Windows NT 6.1)|(Windows 7)',
		'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
		'Windows ME' => 'Windows ME',
		'Open BSD'=>'OpenBSD',
		'Sun OS'=>'SunOS',
		'Linux'=>'(Linux)|(X11)',
		'Safari' => '(Safari)',
		'Macintosh'=>'(Mac_PowerPC)|(Macintosh)',
		'QNX'=>'QNX',
		'BeOS'=>'BeOS',
		'OS/2'=>'OS/2',
		'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)'
	);

	foreach($oses as $os=>$pattern){ // Loop through $oses array
    // Use regular expressions to check operating system type
		if(eregi($pattern, $userAgent)) { // Check if a value in $oses array matches current user agent.
			return $os; // Operating system was matched so return $oses key
		}
	}
	return 'Unknown'; // Cannot find operating system so return Unknown
}
?>

An example of how this would be used:

<?php
echo getOS($_SERVER['HTTP_USER_AGENT']);
?>

This script can be used with the Get Browser Type, which also has the same structure as this script.

Prevent direct file access

Do you have PHP files that you do not want visitors to directly run but would still like to use them in your code? Here is a little trick picked up from the code in the phpBB forum code.

Create a file named config.php or some other file that you are going to include before any other code. In this file put the following:

<?php
define('INMYSCRIPT', 1);
?>

This code creates a defined variable INMYSCRIPT which can be named as anything that you want. Then on every other page in your script that you do not want to be ran on their own put the following: (This filename is code.php)

<?php
if(!defined('INMYSCRIPT')){
echo 'You cannot access this file directly.';
die;
}

// Whatever other code you wish goes below here
echo 'This file is safe to be ran';
?>

Now, instead of the file outputting any data to the browser that could be harmful, the only content output is: “You cannot access this file directly”. You could very easily create a re-direct script to transfer them to a specific page or you could modify the text to any other HTML or other content you wanted.

Open up your web browser and try accessing code.php. You should get that error message that we created. Now if you create one last file that we will name as test.php, place the following:

<?php
require('config.php');
require('code.php');
?>

Now if you try accessing the test.php file from your web server you will be shown: “This file is safe to be ran”.

Calculate a percentage

Below is a quick function that simplifies the process of calculating a percentage in PHP.

<?php
function percent($Amount = 0, $Total = 0, $Decimal = 0) {
	// Make sure our numbers are actually numbers
	$Amount = (INT) $Amount;
	$Total = (INT) $Total;
	$Decimal = (INT) $Decimal;
	// Cannot divide by zero so check if Total = 0
	if ($Total === 0) {
		return 0;
	}
	$p = $Amount / $Total;
	// Multiply by 100 to move decimal point to correct location
	$p *= 100;
	// Return the percentage with specified decimal places
	return number_format($p, $Decimal);
}
?>

Then to use this code you can do:

<?php
// prints out 10% on the screen
echo percent(10, 100),'%';
?>

Add suffix to a number

Have you ever had to dynamically add the suffix to a number? (ie. st, nd, rd, th)

<?php
/*
Author: Daniel Kassner
Website: http://www.danielkassner.com
*/
function number_suffix($i) {
    switch( floor($i/10) % 10 ) {
        default:
	    switch( $i % 10 ) {
                case 1: return 'st';
                case 2: return 'nd';
                case 3: return 'rd';  
            }
        case 1:
    }
    return 'th';
}
?>

Then to use the code you would do like:

<?php
$number = 10;
// This will display 10th
echo $number,number_suffix($number);
?>

Get Browser Type

Have you ever wanted to create a stats application that identifies the users browser type? The following function will allow you to easily do just that. This function can be expanded by adding more values to the $browser array so you can match other browsers. This getBrowser() function parses the $_SERVER['HTTP_USER_AGENT'] variable to get the current browser.

<?php
/*
Author: Daniel Kassner
Website: http://www.danielkassner.com
*/
function getBrowser($userAgent) {
  // Create list of browsers with browser name as array key and user agent as value. 
	$browsers = array(
		'Opera' => 'Opera',
		'Mozilla Firefox'=> '(Firebird)|(Firefox)', // Use regular expressions as value to identify browser
		'Galeon' => 'Galeon',
		'Mozilla'=>'Gecko',
		'MyIE'=>'MyIE',
		'Lynx' => 'Lynx',
		'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)',
		'Konqueror'=>'Konqueror',
		'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp/cat)|(msnbot)|(ia_archiver)',
		'Internet Explorer 8' => '(MSIE 8\.[0-9]+)',
                'Internet Explorer 7' => '(MSIE 7\.[0-9]+)',
		'Internet Explorer 6' => '(MSIE 6\.[0-9]+)',
		'Internet Explorer 5' => '(MSIE 5\.[0-9]+)',
		'Internet Explorer 4' => '(MSIE 4\.[0-9]+)',
	);

	foreach($browsers as $browser=>$pattern) { // Loop through $browsers array
    // Use regular expressions to check browser type
		if(eregi($pattern, $userAgent)) { // Check if a value in $browsers array matches current user agent.
			return $browser; // Browser was matched so return $browsers key
		}
	}
	return 'Unknown'; // Cannot find browser so return Unknown
}
?>

How to use this code:

<?php
echo getBrowser($_SERVER['HTTP_USER_AGENT']);
$browserType = getBrowser($_SERVER['HTTP_USER_AGENT']);
echo '<br />I am currently running '.$browserType.' as my web browser';
?>

This would produce the following if I were(and am) running Mozilla Firefox:

Mozilla Firefox
I am currently running Mozilla Firefox as my web browser

If you wanted to see a larger list of browser user agent strings to expand this code you can find them at: User Agent String dot com

Convert Dell service tags and express service tags with PHP

I was given the task at my real job of creating some code to find the service tag from the express service tag of Dell laptops. We only had recorded the express service tag for the 100+ laptops and needed to have the service tag in a project we were working on. I was given some very basic information about the relationship between the two and came up with the following code. With this code you can convert service tags into express service tags and the other way around. It uses a base 36 style formating.

<?php
/*
Author: Daniel Kassner
Website: http://www.danielkassner.com
*/
function convertExpress($tag) {
  $index = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','e');
  
  for($i=10; $i>=0; $i--) {
    $digits[$i] = '0';
    for($k=1; $k<=36; $k++) {
      $tmp = (pow(36, $i)) * $k;
      $tmp2 = $tag - $tmp;
      if($tmp2 < 0) {
        $tmp = (pow(36, $i)) * ($k-1);
        $digits[$i] = $index[$k-1];
        $tag -= $tmp;
        break;
      }
      
      if($tmp2 == 0) {
        $digits[$i] = $index[$k];
        $tag -= $tmp;
        break;
      }   
    }
  }
  $leading = 1;
  foreach($digits as $digit) {
    /*if($digit != '0') {
      $num .= $digit;
    }*/
    if($leading) {
      if($digit != '0') {
        $leading = 0;
        $num .= $digit;
      }
    } else {
      $num .= $digit;
    }
  }
  return $num;
}
?>

To use this code you could use:

<?php
echo convertExpress('(YOUR EXPRESS SERVICE TAG HERE');
?>

Make sure you only use numbers this field.

To get the express service tag from the service tag use the following function:

<?php
/*
Author: Daniel Kassner
Website: http://www.danielkassner.com
*/
function convertTag($tag) {
  $tag = strtoupper($tag);
  $index = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  $count = strlen($tag);
  $count2 = $count - 1;
  for($i=0; $i<$count; $i++) {
    $digits[$count2] = substr($tag, $i, 1);
    $count2--;
  }
  $numb = 0;
  for($i=0; $i<count($digits); $i++) {
    if($i==0) {
      $m = 1;
    } else {
      $m = pow(36, $i);
    }
    $key = array_keys($index, $digits[$i]);
    $tmp = ($m * $key[0]);
    $numb += $tmp;
  } 
  return $numb;
}
?>

To use this code you can use:

<?php
echo convertTag('(YOUR SERVICE TAG HERE)');
?>

Sanitize copy/paste text from word

In a recent project I have had to deal with text copied from a Microsoft Word document and pasted into a textarea. Word automatically changes a few certain characters to what it thinks it should be, such as the ellipsis and quotes. When dealing with inserting that text into a database I was getting errors. To solve my problems I created a sanitize function to replace these certain characters with acceptable characters.

<?php
// Used to sanitize Microsoft Word's Special Characters
// Good reference http://www.lookuptables.com

function SanitizeFromWord($Text = '') {

	$chars = array(
		130=>',',     // baseline single quote
		131=>'NLG',   // florin
		132=>'"', 	  // baseline double quote
		133=>'...',   // ellipsis
		134=>'**',	  // dagger (a second footnote)
		135=>'***',	  // double dagger (a third footnote)
		136=>'^', 	  // circumflex accent
		137=>'o/oo',  // permile
		138=>'Sh',	  // S Hacek
		139=>'<',	  // left single guillemet
		140=>'OE',	  // OE ligature
		145=>'\'',	  // left single quote
		146=>'\'',	  // right single quote
		147=>'"',	  // left double quote
		148=>'"',	  // right double quote
		149=>'-',	  // bullet
		150=>'-',	  // endash
		151=>'--',	  // emdash
		152=>'~',	  // tilde accent
		153=>'(TM)',  // trademark ligature
		154=>'sh',	  // s Hacek
		155=>'>',	  // right single guillemet
		156=>'oe',	  // oe ligature
		159=>'Y',	  // Y Dieresis
		169=>'(C)',	  // Copyright
		174=>'(R)'	  // Registered Trademark
	);
	
	foreach ($chars as $chr=>$replace) {
		$Text = str_replace(chr($chr), $replace, $Text);
	}
	return $Text;
}
?>

Enjoy!

Switch to our mobile site