Skip to content
Derek Jones edited this page Jul 4, 2012 · 11 revisions

Category:Contributions::Libraries::Networking

This library provides a simple way to get the number of subscribers of a FeedBurner account through the FeedBruner Awareness API. The library provides also a file based caching system since an extra HTTP request is needed to get the FeedBurner account data.

The library is also available as a PHP5 class for non CodeIgniter applications.

Licensed under [url=http://www.gnu.org/licenses/lgpl.html/]GNU Lesser General Public License[/url].

Please note that this class requires PHP 5.1.0 with SimpleXML and libxml and the cURL extension.

[b]For more details, support, feature request or packaged downloads please see[/b] the [url=http://www.kromack.com/feedburner-library-for-php-and-codeigniter/]FeedBurner Library for PHP and CodeIgniter[/url] dedicated page on my blog.

[b]FAQ[/b]

  • If a path related error occurs when enabling cache, please ensure to add the final trailing slash to $path (e.g. ./folder/sub-folder/final-folder/).

  • Some users on WAMP could experiment a problem with cURL in local. First try your application online to check if your code works on a production server.

[b]How to use :[/b]

<?php
 
class Test extends Controller {
 
    function Test()
    {
        parent::Controller();    
    }
 
    function index()
    {
        $config = array();
        $config['username']        = 'your_feed_url_username';
        $config['cache']           = TRUE;
        $config['path']            = './tmp/';
        $config['filename']        = 'feedburner.xml';
        $config['ttl']             = 60;
 
        $this->load->library('feedburner', $config);
 
        echo $this->feedburner->getCirculation();
 
    }
}
 
/* End of file test.php */
/* Location: ./system/application/controllers/test.php */

[b]Library's code (system/application/libraries/Feedburner.php):[/b]

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

/**
* Please visit http://www.kromack.com/feedburner-library-for-php-and-codeigniter for full details and support about this library.
* 
* Please specify your FeedBurner username, for example http://feeds2.feedburner.com/my_blog, your username is "my_blog".
* 
* This class include a file based caching system since an extra HTTP request is required to retrieve FeedBurner account information.
* 
* Using cache is more than 5 time faster.
* 
* In order to activate the caching system, please set $cache to TRUE and specify the $path (and optionally the $filename to use)
* where the caching file should be written.
* 
* Please ensure to add the final trailing slash to $path (e.g. ./folder/sub-folder/final-folder/).
* 
* You can also specify the time to live (in minutes) of the stored xml cached file, for example, set to 60 to keep alive the stored response
* for one hour.
*
* @author Samuel Sanchez <[email protected]>
* @link http://www.kromack.com/feedburner-library-for-php-and-codeigniter
* @license http://www.gnu.org/copyleft/lesser.html
* @copyright Copyright (c) 2009, Samuel Sanchez
* @version 1.0 
* @param string $username
* @param bool $cache
* @param string $path
* @param string $filename
* @param int $ttl
*/
class Feedburner {

    public $username    = '';    
    
    public $cache        = FALSE;
    public $path        = './';
    public $filename    = 'feedburner.xml';
    public $ttl            = 60;    
    
    protected $response = '';
    protected $xml        = '';
    
    function Feedburner($props = array()) {
        
        if (count($props) > 0)
        {
            $this->initialize($props);
        }
        
        log_message('debug', "Feedburner Class Initialized");
                            
    }
    
    /**
     * Initialize preferences
     *
     * @access    public
     * @param    array
     * @return    void
     * @package CodeIgniter
     */    
    function initialize($config = array())
    {
        $defaults = array(
                            'username'            => '',
                            'cache'                => FALSE,
                            'path'                => './',
                            'filename'            => 'feedburner.xml',
                            'ttl'                => 60,
                            'response'            => '',
                            'xml'                => ''
                        );    
    
    
        foreach ($defaults as $key => $val)
        {
            if (isset($config[$key]))
            {
                $method = 'set_'.$key;
                if (method_exists($this, $method))
                {
                    $this->$method($config[$key]);
                }
                else
                {
                    $this->$key = $config[$key];
                }            
            }
            else
            {
                $this->$key = $val;
            }
        }
    }
    
    
    function getData() {
        
        $url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=' . $this->username;
        
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        
        $this->response = curl_exec&#40;$ch&#41;;
        
        curl_close($ch);
        
    }

    function setData() {
        
        if($this->cache === TRUE) {
            $this->manageCache();
        } else {
            
            if(empty($this->xml)) {

                $this->getData();
                $this->xml = new SimpleXMLElement($this->response);                
            }                
        }
    }
    
    function manageCache() {
            
        if(!is_dir($this->path)) {
            die('The path you specified to the FeedBurner library is not valid, please check if the directory exists before enable caching.');
        }
        
        if(!is_writable($this->path)) {
            die('The path you specified to the FeedBurner library is not writable, please check its permissions or CHMOD 777 it.');
        }        
        
        if(file_exists($this->path . $this->filename)) {
            
            if(strlen(file_get_contents&#40;$this->path . $this->filename&#41;) > 0) {
                
                //The file must content valid XML datas but we have to prevent errors reporting
                if($xml = simplexml_load_file&#40;$this->path . $this->filename,null, LIBXML_NOERROR&#41;) {
                    
                    $this->xml = $xml;
                    
                    $ttl = $this->xml->data->attributes();
                    $ttl = $ttl[0];
                    
                    $interval = (time() - $ttl) / 60;

                    //Refreshing the XML stored file
                    if($interval > $this->ttl) {
                        $this->setCache();
                    }
                    
                } else {
                    $this->setCache();
                }
                
            } else {
                $this->setCache();
            }
        } else {
            $this->setCache();
        }
    }
    
    function setCache() {
        
        $this->getData();
        $this->xml = new SimpleXMLElement($this->response);    
        
        //We adding a timestamp to the response in order to calculate the time to live of the cached response    
        $data = $this->xml->addChild('data');
        $data->addAttribute('timestamp', time());
        
        $handle = fopen&#40;$this->path . $this->filename, 'w+'&#41;;
        fwrite($handle, $this->xml->asXML());                    
    }
    
    function getCirculation() {
        
        $this->setData();
        
        return $this->xml->feed->entry['circulation'];

    }    
}

?&gt;
Clone this wiki locally