10 super useful PHP snippets

by Jean. 32 Comments -

Having the right code snippet at the right time can definitely be a life saver for web developers. Today, I’ve compiled 10 really awesome PHP code snippets that will, I hope, be very helpful in your forthcomming developments.

Super simple page caching

When your project isn’t based on a CMS or framework, it can be a good idea to implement a simple caching system on your pages. The following code snippet is very simple, but works well for small websites.

<?php
    // define the path and name of cached file
    $cachefile = 'cached-files/'.date('M-d-Y').'.php';
    // define how long we want to keep the file in seconds. I set mine to 5 hours.
    $cachetime = 18000;
    // Check if the cached file is still fresh. If it is, serve it up and exit.
    if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile);
        exit;
    }
    // if there is either no file OR the file to too old, render the page and capture the HTML.
    ob_start();
?>
    <html>
        output all your html here.
    </html>
<?php
    // We're done! Save the cached content to a file
    $fp = fopen($cachefile, 'w');
    fwrite($fp, ob_get_contents());
    fclose($fp);
    // finally send browser output
    ob_end_flush();
?>

» Credit: Wes Bos

Calculate distances in PHP

Here is a very handy function, which calculate the distance from a point A to a point B, using latitudes and longitudes. The function can return the distance in miles, kilometers, or nautical miles.

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == "K") {
    return ($miles * 1.609344);
  } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
        return $miles;
      }
}

Usage:

echo distance(32.9697, -96.80322, 29.46786, -98.53506, "k")." kilometers";

» Credits: PHP Snippets.info

Convert seconds to time (years, months, days, hours…)

This useful function will convert a time in seconds to a time in years, months, weeks, days, and so on.

function Sec2Time($time){
  if(is_numeric($time)){
    $value = array(
      "years" => 0, "days" => 0, "hours" => 0,
      "minutes" => 0, "seconds" => 0,
    );
    if($time >= 31556926){
      $value["years"] = floor($time/31556926);
      $time = ($time%31556926);
    }
    if($time >= 86400){
      $value["days"] = floor($time/86400);
      $time = ($time%86400);
    }
    if($time >= 3600){
      $value["hours"] = floor($time/3600);
      $time = ($time%3600);
    }
    if($time >= 60){
      $value["minutes"] = floor($time/60);
      $time = ($time%60);
    }
    $value["seconds"] = floor($time);
    return (array) $value;
  }else{
    return (bool) FALSE;
  }
}

» Credits

Force file download

Some files, such as mp3, are generally played throught the client browser. If you prefer forcing download of such files, this is not a problem: The following code snippet will do that job properly.

function downloadFile($file){
        $file_name = $file;
        $mime = 'application/force-download';
	header('Pragma: public'); 	// required
	header('Expires: 0');		// no cache
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Cache-Control: private',false);
	header('Content-Type: '.$mime);
	header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
	header('Content-Transfer-Encoding: binary');
	header('Connection: close');
	readfile($file_name);		// push it out
	exit();
}

» Credit: Alessio Delmonti

Get current weather using Google API

Want to know today’s weather? This snippet will let you know, in only 3 lines of code. The only thing you have to do is to replace ADDRESS by the desired adress, on line 1.

$xml = simplexml_load_file('http://www.google.com/ig/api?weather=ADDRESS');
  $information = $xml->xpath("/xml_api_reply/weather/current_conditions/condition");
  echo $information[0]->attributes();

» Credit: Ortanotes

Basic PHP whois

Whois services are extremely useful to get basic information about a domain name: owner, creation date, registrar, etc. Using PHP and the whois unix command, it is extremely easy to create a basic whois PHP function. Please note that the whois unix command must be installed on your server for this code to work.

$domains = array('home.pl', 'w3c.org');

function creation_date($domain) {
    $lines = explode("\n", `whois $domain`);
    foreach($lines as $line) {
        if(strpos(strtolower($line), 'created') !== false) {
            return $line;
        }
    }

    return false;
}

foreach($domains as $d) {
    echo creation_date($d) . "\n";
}

» Credits: Snipplr

Get latitude and longitude from an adress

With the popularity of the Google Maps API, developers often needs to get the latitude and longitude of a particular place. This very useful function takes an adress as a parameter, and will return an array of data containing both latitude and longitude.

function getLatLong($address){
	if (!is_string($address))die("All Addresses must be passed as a string");
	$_url = sprintf('http://maps.google.com/maps?output=js&q=%s',rawurlencode($address));
	$_result = false;
	if($_result = file_get_contents($_url)) {
		if(strpos($_result,'errortips') > 1 || strpos($_result,'Did you mean:') !== false) return false;
		preg_match('!center:\s*{lat:\s*(-?\d+\.\d+),lng:\s*(-?\d+\.\d+)}!U', $_result, $_match);
		$_coords['lat'] = $_match[1];
		$_coords['long'] = $_match[2];
	}
	return $_coords;
}

» Credits: Snipplr

Get domain favicon using PHP and Google

These days, many websites or webapps are using favicons from other websites. Displaying a favicon on your own site is pretty easy using Google and some PHP.

function get_favicon($url){
  $url = str_replace("http://",'',$url);
  return "http://www.google.com/s2/favicons?domain=".$url;
}

» Credits: Snipplr

Calculate Paypal fees

Ah, Paypal fees. Every person who ever used the popular online payment service had to pay their fees. So what about a PHP function to easily calculate the fee for a specific amount?

function paypalFees($sub_total, $round_fee) {
	
	// Set Fee Rate Variables
	$fee_percent = '3.4'; // Paypal's percentage rate per transaction (3.4% in UK)
	$fee_cash    = '0.20'; // Paypal's set cash amount per transaction (£0.20 in UK)
	
	// Calculate Fees
	$paypal_fee = ((($sub_total / 100) * $fee_percent) + $fee_cash);
	
	if ($round_fee == true) {
		$paypal_fee = ceil($paypal_fee);
	}
	
	// Calculate Grand Total
	$grand_total = ($sub_total + $paypal_fee);
	
	// Tidy Up Numbers
	$sub_total   = number_format($sub_total, 2, '.', ',');
	$paypal_fee  = number_format($paypal_fee, 2, '.', ',');
	$grand_total = number_format($grand_total, 2, '.', ',');
	
	// Return Array
	return array('grand_total'=>$grand_total, 'paypal_fee'=>$paypal_fee, 'sub_total'=>$sub_total);
}

» Credits: Snipplr

(Last snippet have been removed due to an error, sorry)

Comments (32) - Leave yours

  1. scribu said:

    The last snippet clearly won’t work, since it’s part of a class that has a copyFile() method.

    Don’t you test these before you post them?

  2. Paul Taylor said:

    There’s some very useful scripts here.

    Recently I was working on a whois function at work to continuously whois any number of domains from a database. I soon discovered though that Whois lookup (through mainly Nominet, not sure about others) has a limit on how many you can do within a certain time frame. So, it if checking more than a few domains, I’d recommend adding sleep(xx); to the foreach loop, as such:

    foreach($domains as $d) {
    echo creation_date($d) . “\n”;
    sleep(xx);
    }

    (replacing “xx” with your time in seconds of course).

  3. Bart said:

    This is a neat list of snippets. Related to the location snippet (#7), what is a good way to get the (broad) location of a visitor of a website? What API do you recommend?

    • Mike said:

      Best way is to use a service like MaxMind GeoIP. Their website is a bit difficult to navigate, but take a look around http://www.maxmind.com/app/ip-location. It’s a service you pay for … alternatively they have a free database somewhere on there if you want to download it and host it yourself.

  4. WebDevHobo said:

    I’d like to note for all those reading this who plan to make a Google Maps app somewhere in the future: the snippet caculating the distance between 2 points does so from birds-eye-view. In a direct line. It doesn’t take in to account all the streets and highways and their curves. It’s just the distance in a straight line.

    For college, I once had to make an site where you could search for a babysitter, where you could drop your kid off for the evening.

    Suppose you entered maximum distance: 20 kilometers. 20 kilometers in 1 straight line is a lot less than the distance you’ll actually be driving to get there.

  5. Fausto Carrera said:

    The problem with the ofrce dowload it’s if somebody pass a .php file, the db connection file and download it, you should check what kind of file are you downloading.

    @Bart: http://ipinfodb.com have and API thtat give you the lat and log according to an IP.

  6. aleks said:

    seriously, no quality control on here at all, eh?

    as pointed out before, that “Save url to PDF” snippet won’t even work on its own.

  7. porquero said:

    I think that using this api for geolocalization is better:

    http://maps.google.com/maps/api/geocode/json?sensor=false&address=LITERAL_ADRESS

    It returns a Json with information.

  8. Jatin said:

    Hey.

    Google API to fetch favicon is not working for every URL.

    Have you tried?

    Try some domains like http://www.google.com/s2/favicons?domain=gmail.com ?

    At least when I tried it, it was not giving results for every URL

  9. GIochi Winx said:

    Im pretty aged blogger but im still new In php..

    Im not that familiar with it..
    This article (post) helped me a lot and im not that confused about certain thing snow.
    thanks.

  10. johnson said:

    If your new to PHP do your self a favor and stay away from this crappy procedural coding. Author – Please do us the favor of
    1) write code using best practices…it can still be short
    2) use Object-oriented programming….procedural programming has seen its day people!
    3) lookup what you post before you post it. That caching method is terrifying…try passing a parameter to ob_start, and at LEAST put some of the file writing in a function.

    • Jean-Baptiste Jung said:

      While OOP can be great sometimes, I do not think procedural coding is dead. When you have to code a simple page, would you use OO and/or a framework to echo today’s date? Definitely no.

      Regarding the caching method, I wouldn’t use it on my website, but I figured it is interresting enough to be featured here.

    • Casey said:

      You need to learn the basics of PHP via procedural and understand it before you can even dream of using OOP…

  11. Jatin said:

    PHP is around for sometimes now, and have matured enough. I was thinking whether there is any library or something that have all the required and essentials functions already built-in.

  12. eve said:

    those are neat- I have been playing around with PHP, these will be fun to practice with. (Trying to expand beyond wordpress lol)

  13. Gerold said:

    Thanks,

    the snippet “Basic PHP whois” really helped me. Now trying to configure it for all top level domains and different whois responses …

    Regards,

    Gerold

    • 9miles said:

      I posted a comment down below – but a great bit to add to that lat/long would be this to capture a lat/long from a postcode:

      $postcode = ‘http://maps.google.com/maps/geo?q=’.$postcode.’,+UK&output=csv&sensor=false’;

      $data = @file_get_contents($postcode);

      $result = explode(“,”, $data);

      // Google brings back an array of 3, so we start at 2 to get the 3rd and 4th value of the array.
      // As these are the long and lat

      $custlat = $result[2];
      $custlong = $result[3];

  14. Floris said:

    Good job, and thanks for sharing. I like the super simple caching method one. Very handy. And something a lot of coders simply forget – there’s no need to ‘per page load hammering of servers’ ..

  15. Robert said:

    About the weather using Google API, is there a way to return more information? Cause now it only says one or two words :) . And by the way it only works with PHP 5.

  16. James Watson said:

    It is very useful code for me. And I saved it for my future need. When I need them I just copy and paste them with some editing. Nice post ya.

  17. Mickaël Wolff said:

    If procedural code is legacy, it always is a good way to show a specific thing without OO boilerplate. And it is good to mention that PHP is not an object oriented language : it is a procedural one with object oriented features.

    They are a big problem with the Paypal fee calculator. float numbers shouldn’t be used for decimal calculation. Float numbers are not decimal numbers. It is the representation of an approximation of a decimal number. While computing distances, it isn’t a big deal because you have to consider some approximation. But when it involves money, the matter is a legal one.
    In PHP, decimal numbers doesn’t exist. So, you must use an external library (like GMP http://php.net/manual/en/book.gmp.php) or the available SQL database (decimal SQL type should be exact).

    Sec2Time is wrong. It doesn’t account for leap day years, time shift, etc. The use of native functions is mandatory to compute time distances. And it will be faster. But the worst thing is the very VERY BAD pratice you show in : raw data. Here, we can deduce what is 31556926 for. But, reading source code shouldn’t make me bug on obvious things.

  18. Sneha said:

    Thanks for these, especially the weather one.
    but its not working.i am getting an Fatal error: Call to a member function attributes() on a non-object in D:\xampp\htdocs\demo\1.php on line 183

    please reply me what to do.I am a beginner ,i dont know how to solve it.

  19. James Watson said:

    The most useful and important tricky scripts are here. Very nice and effective post. I have tried all the scripts here and found no error. Excellent job. Thanks for the post.

  20. Per Persson said:

    In Sec2Time() it’s totally unnecessary to cast FALSE to bool and $value to array. They already are of the respective types.

    My own version: https://gist.github.com/2597798

Leave a Reply

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

Please respect the following rules: No advertising, no spam, no keyword in name field. Thank you!