Rackspace Cloud Files USA to the UK service free php migration script

September 6th, 2011

Rackspace Cloud Migration Download

Recently I’ve moved from Rackspace cloud US to the UK, and as such needed to transfer a large amount of data from my cloud files. Rackspace will not provide this service for customers unfortunately due to many legal hoops required when handling customer data, therefore I had to create a solution of my own to save doing this manually
Thankfully RS do provide a PHP SDK for their cloudfiles API, available here. You will need to have this installed as well as the php script for the script to function correctly

Please note that you will need to create a container in your UK cloudfiles to transfer into. Also note that you use this script at your own risk. I take no responsibility for any data loss/corruption as a result of using this script

Simple timer class for benchmarking in PHP

February 3rd, 2010

Here’s a simple timer class that I wrote to help with benchmarking tests while running PHP code, in order to see how quick code is running, although it can be used for any timer functionality really. I have clearly documented the code below, along with an example of how to use the timer

Timer Class Download

/*******************************************************************************
*                                     Timer class                              *
*                             Created: 27th January 2010                       *
*                             ©Copyright Jay Gilford 2010                      *
*                              http://www.jaygilford.com                       *
*                            email: jay [at] jaygilford.com                    *
*******************************************************************************/


class timer {
    private $_start = 0;
    private $_elapsed = 0;
    private $_running = false;
    
    /**
     * timer::construct()
     * set the timer running of $start is true
     * 
     * @param bool $start
     * @return true
     */
    public function __construct($start = false) {
        // If true is passed, start the timer immediately
        if($start === true)
            $this->start();
            
        return true;
    }
    
    /**
     * timer::start()
     * start the timer
     * 
     * @return true
     */
    public function start() {
        // Reset timer
        $this->reset(false);
        // Set status to running
        $this->_running = true;
        // Set timer running
        $this->_start = $this->_time();
            
        return true;
    }
    
    /**
     * timer::stop()
     * stops the timer and returns the total time elapsed
     * 
     * @return mixed
     */
    public function stop() {
        // If the timer isn't running return false
        if($this->_running === false)
            return false;
        
        // Set the final elapsed time and stop the timer
        $this->_elapsed = $this->_get_elapsed();
        $this->_running = false;
        $this->_start = 0;
        
        // Return the timers total elapsed time
        return $this->_elapsed;
    }
    
    /**
     * timer::pause()
     * pauses/unpauses the timer
     * 
     * @return NULL
     */
    public function pause() {
        // If the timer isn't running return false
        if($this->_running === false)
            return false;

        // If the timer is paused set the timer from the current time
        if($this->_start == 0) {
            $this->_start = $this->_time();
            
        // Otherwise add the currently elapsed time to the total
        // elapsed time and pause the timer
        }else{
            $this->_elapsed = $this->_get_elapsed();
            $this->_start = 0;
        }
    }
    
    /**
     * timer::elapsed()
     * returns the total time elapsed since the timer started
     * 
     * @return float
     */
    public function elapsed() {
        return $this->_get_elapsed();
    }
    
    /**
     * timer::reset()
     * resets the timers variables back to default
     * 
     * @param bool $start
     * @return
     */
    public function reset($start = false) {
        // Reset all variables
        $this->_start = 0;
        $this->_elapsed = 0;
        $this->_running = false;
        
        // If $start is true restart the timer immediately
        if($start === true)
            $this->start();
        
        return true;        
    }
    
    /**
     * timer::_time()
     * returns the current unix time (with milliseconds)
     * 
     * @return float
     */
    private function _time() {
    	$time = explode(' ', microtime());
    	$time =  (float)$time[1] + $time[0];
        return $time;
    }
    
    /**
     * timer::_get_elapsed()
     * Returns the current elapsed time
     * 
     * @return float
     */
    private function _get_elapsed() {
        if($this->_running === false || $this->_start == 0)
            return $this->_elapsed;
        
        return $this->_elapsed + ($this->_time() - $this->_start);
    }
}

Here is a simple example of how to use the class for working out SQL execution times

include 'timer.class.php';
$db_timer = new timer();

// Connect to database here and create the query to be run
mysql_connect('localhost', 'root', '');
mysql_select_db('database');


$query = "SELECT * FROM table";

// Start timer before executing query
$db_timer->start();
$result = mysql_query($query);

// Pause timer
$db_timer->pause();

// Echo out the selected data
while($row = mysql_fetch_assoc($result)) {
    echo print_r($row, true);
}

// Create another query
$query = "SELECT * FROM table2";

// Unpause the timer
$db_timer->pause();

// Execute the query
$result = mysql_query($query);

// Stop the timer and get the total execution time
$total_time = $db_timer->stop();

// Display details
echo 'SQL queries took '.$total_time.' seconds to execute in total';

If you have any questions or comments including possible improvements feel free to comment or send me a message via the contact page

Using the PHP Document Object Model (DOM) to get all page links

January 27th, 2010

Further to the article I wrote about parsing links from a html page, here is a more elegant and accurate solution to getting every link using the Document Object Model (DOM)

/**
 * @author Jay Gilford
 */

/**
 * get_links()
 * 
 * @param string $url
 * @return array
 */
function get_links($url) {
    
    // Create a new DOM Document to hold our webpage structure
    $xml = new DOMDocument();
    
    // Load the url's contents into the DOM (the @ supresses any errors from invalid XML)
    @$xml->loadHTMLFile($url);
    
    // Empty array to hold all links to return
    $links = array();
    
    //Loop through each  and  tag in the dom and add it to the link array
    foreach($xml->getElementsByTagName('a') as $link) {
        $links[] = array('url' => $link->getAttribute('href'), 'text' => $link->nodeValue);
    }
    
    //Return the links
    return $links;
}

The code above is clearly documented as to how it all works. To call the function simply use
$links = get_links('http://www.example.com');
changing the website link to the page you require the links off. You could also expand this code to give you further details for the links such as the no follow attributes and so forth

If you have any questions about this feel free to contact me as always

Also please note that this requires PHP 5 in order for you to be able to use the DOMDocument

How to reset your wordpress administrator password

November 10th, 2009
  1. Save the file from the download link below into your root wordpress directory, then go to your WordPress site (http://www.yoursite.com/wp-directory/wpreset.php)
  2. Select the administrator account from the drop down, enter a new password and click the button to reset it

Wordpress reset script download

Here’s the PHP code with commenting for anyone interested in how it works

//Load wordpress bootstrap and include containing the registration functions
require('wp-load.php');
require('wp-includes/registration.php');

//Create empty array to hold a list of usernames and their id for our dropdown
$users = array();
//Create empty array to hold our user info for the WordPress update function
$user = array();
//Loop through each user in the database and add them to our users array if they're an admin
while($u = get_userdata(++$i)) {
    if(isset($u->wp_capabilities['administrator']) && $u->wp_capabilities['administrator'] == 1) {
        $users[$i] = $u->user_nicename;
    }
}

// If our form has been submitted, process the information sent
if(isset($_POST['ID'])) {
    //Trim password and assign it to $pass
    $pass = trim($_POST['password']);
    //If the password is empty assign the information message
    if($pass == '') {
        $info = 'ERROR: Password needed in order to reset';
    //Otherwise set our array variables to pass to the update function
    }else{
        $user['ID'] = $_POST['ID'];
        $user['user_pass'] = $pass;
        //Update the user
        wp_update_user($user);
        //Assign message letting the user know the password has been set
        $info = 'User `'.$users[$user['ID']].'` updated successfully!';
    }
}

As you can see, the process is fairly straightforward and will allow you to reset your password(s) to whatever you choose without the need of resetting via e-mail, then entering the new random password into the login and setting your password to the desired new password

If you have any questions, bug reports or want to simply comment feel free to contact me via the contact page

Number to text converting PHP class

November 2nd, 2009

One thing that gets asked quite a bit on forums is how to convert a number into words in PHP, so I thought I’d write a small class that can do this
Number to text Class Download
Here is the code for the class

class num2text {
    private $_original = 0;
    private $_parsed_number_text = '';
    private $_single_nums = array(1 => 'One', 2 => 'Two', 3 => 'Three', 4 => 'Four', 5 => 'Five', 6 => 'Six', 7 => 'Seven', 8 => 'Eight', 9 =>
        'Nine', );

    private $_teen_nums = array(0 => 'Ten', 1 => 'Eleven', 2 => 'Twelve', 3 => 'Thirteen', 4 => 'Fourteen', 5 => 'Fifteen', 6 => 'Sixteen', 7 =>
        'Seventeen', 8 => 'Eighteen', 9 => 'Nineteen', );

    private $_tens_nums = array(2 => 'Twenty', 3 => 'Thirty', 4 => 'Forty', 5 => 'Fifty', 6 => 'Sixty', 7 => 'Seventy', 8 => 'Eighty', 9 =>
        'Ninety', );

    private $_chunks_nums = array(1 => 'Thousand', 2 => 'Million', 3 => 'Billion', 4 => 'Trillion', 5 => 'Quadrillion', 6 => 'Quintrillion', 7 =>
        'Sextillion', 8 => 'Septillion', 9 => 'Octillion', 9 => 'Nonillion', 9 => 'Decillion', );

    function __construct($number) {
        $this->_original = trim($number);
        $this->parse();
    }
    
    public function parse($new_number = NULL) {
        if($new_number !== NULL) {
            $this->_original = trim($new_number);
        }
        if($this->_original == 0) return 'Zero';
        
        $num = str_split($this->_original, 1);
        krsort($num);
        $chunks = array_chunk($num, 3);
        krsort($chunks);
        
        $final_num = array();
        foreach ($chunks as $k => $v) {
            ksort($v);
            $temp = trim($this->_parse_num(implode('', $v)));
            if($temp != '') {
                $final_num[$k] = $temp;
                if (isset($this->_chunks_nums[$k]) && $this->_chunks_nums[$k] != '') {
                    $final_num[$k] .= ' '.$this->_chunks_nums[$k];
                }
            }
        }
        $this->_parsed_number_text = implode(', ', $final_num);
        return $this->_parsed_number_text;
    }
    
    public function __toString() {
        return $this->_parsed_number_text;
    }

    private function _parse_num($num) {
        $temp = array();
        if (isset($num[2])) {
            if (isset($this->_single_nums[$num[2]])) {
                $temp['h'] = $this->_single_nums[$num[2]].' Hundred';
            }
        }

        if (isset($num[1])) {
            if ($num[1] == 1) {
                $temp['t'] = $this->_teen_nums[$num[0]];
            } else {
                if (isset($this->_tens_nums[$num[1]])) {
                    $temp['t'] = $this->_tens_nums[$num[1]];
                }
            }
        }
        
        if (!isset($num[1]) || $num[1] != 1) {
            if (isset($this->_single_nums[$num[0]])) {
                if (isset($temp['t'])) {
                    $temp['t'] .= ' '.$this->_single_nums[$num[0]];
                } else {
                    $temp['u'] = $this->_single_nums[$num[0]];
                }
            }
        }
        return implode(' and ', $temp);
    }
}

Using this class is as simple as using two lines of code such as

$n2s = new num2string('123456');
echo $n2s;

Should you wish to parse more than one string after this, you can use

echo $n2s->parse('87654321');

It really is that simple to use
Please be aware that in order for all numbers to work, you must enter them as strings