Login   Register  
PHP Classes
elePHPant
Icontem

File: x64_simple_counter.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Full name  >  x64 Simple Counter  >  x64_simple_counter.php  >  Download  
File: x64_simple_counter.php
Role: Class source
Content type: text/plain
Description: This is the main class
Class: x64 Simple Counter
Count site visits using flat files
Author: By
Last change: Fixed an error where already_counted() was returning true instead of false
Fixed an error where clean_expired_ips() messed up the database
Date: 7 years ago
Size: 6,569 bytes
 

Contents

Class file image Download
<?php

/**
 * x64 Simple Counter
 * 
 * A simple visits counter, it uses a flat
 * file as database, and it logs the IP
 * in order to know if the visitor already
 * was counted.
 * It can even be used to know if a visitor already
 * voted, or whatever you want to do.
 * 
 * @author Raphael Geissert - atomo64.puffinhost.com
 * @version 0.1.1
 * @copyright Atomo64 2006-2007
 * @license GNU GPL
 * @example $counter=new x64_simple_counter(); $counter->auto();
 * 
 */
class x64_simple_counter
{
    
/**
     * The name of the file used as DB
     *
     * @var string
     */
    
var $db;
    
/**
     * The number of seconds when the IP expires
     *
     * @var int
     */
    
var $expire;
    
/**
     * If the visitor already was counted(filled when calling count(), get_count() or the function of the name of the var)
     *
     * @var bool
     */
    
var $already_counted;
    
/**
     * This is the number of visits counted
     * This value is used for caching pourposes, preventing from re-opening
     * the file if we already opened it once.
     * Only two functions sets the value of this var, count() (after counting) and get_count()
     * It is going to be null if none of both functions were called yet
     * 
     * @var int,null null if count() or get_count() were not called yet
     */
    
var $count;
    
/**
     * This is the time of since when we are counting
     * For more information about this var see $count
     * The only exception is that the value of this var is set
     * by these functions: count(), get_count(), install(), reset_ips() and clean_expired_ips()
     *
     * @var int,null null if the value has not been set yet.
     */
    
var $since_time;

    
/**
     * Class initiator
     * Checks if the file used ad DB already exists,
     * if not, then it creates it.
     *
     * @param string $file The file name of the file used as DB
     * @param int $expire The expiration time of an IP (in seconds, default is a day)
     * @return x64_simple_counter
     */
    
function x64_simple_counter($file='counter_data.php',$expire=86400)
    {
        
$this->db=$file;
        
$this->expire=$expire;
        if(!
file_exists($file))
        
$this->install();
    }

    
/**
     * Counts the visitor
     *
     * @return bool if the file could be found/open or not
     */
    
function count()
    {
        if(!
file_exists($this->db))
        return 
false;

        
$data=file($this->db);
        
$ips=unserialize($data[1]);
        
$count=unserialize($data[2]);
        
$date=unserialize($data[3]);
        
$this->since_time=$date;

        if(isset(
$ips[$_SERVER['REMOTE_ADDR']]))
        {
            
$ips[$_SERVER['REMOTE_ADDR']]=time();
            
$this->already_counted=true;
        }
        else
        {
            
$count++;
            
$ips[$_SERVER['REMOTE_ADDR']]=time();
            
$this->already_counted=false;
        }

        
$this->count=$count;

        
$flat_file="<?php /* \n".serialize($ips)."\n".serialize($count)."\n".serialize($date)."\n */ ?>";

        
$fp=fopen($this->db,"w");

        if(!
$fp)
        return 
false;

        
fwrite($fp,$flat_file,strlen($flat_file));
        
fclose($fp);

        return 
true;
    }

    
/**
     * Get the number of visits
     *
     * @return false,int false when the file could not be found/open or an int with the visits
     */
    
function get_count()
    {
        if(!
file_exists($this->db))
        return 
false;

        if(
$this->count!==null)
        return 
$this->count;

        
$data=file($this->db);
        
$ips=unserialize($data[1]);
        
$count=unserialize($data[2]);
        
$date=unserialize($data[3]);

        
$this->already_counted=isset($ips[$_SERVER['REMOTE_ADDR']]);
        
$this->count=$count;
        
$this->since_time=$date;

        return 
$count;
    }

    
/**
     * Creates the file used as DB
     *
     * @return bool if the file could be found/open or not
     */
    
function install()
    {
        
$time=time();
        
$flat_file="<?php /* \n".serialize(array())."\n".serialize(0)."\n".serialize($time)."\n */ ?>";
        
$this->since_time=$time;

        
$fp=fopen($this->db,"w");

        if(!
$fp)
        return 
false;

        
fwrite($fp,$flat_file,strlen($flat_file));
        
fclose($fp);

        return 
true;
    }

    
/**
     * Alias of install(); resets all the data
     *
     * @return bool if the file could be found/open or not
     */
    
function reset_all(){ return $this->install(); }

    
/**
     * This removes all the IPs from the database
     *
     * @return bool if the file could be found/open or not
     */
    
function reset_ips()
    {
        if(!
file_exists($this->db))
        return 
false;

        
$data=file($this->db);

        
$count=unserialize($data[2]);
        
$date=unserialize($data[3]);
        
$this->since_time=$date;
        
$flat_file="<?php /* \n".serialize(array())."\n".serialize($count)."\n".serialize($date)."\n */ ?>";

        
$fp=fopen($this->db,"w");

        if(!
$fp)
        return 
false;

        
fwrite($fp,$flat_file,strlen($flat_file));
        
fclose($fp);

        return 
true;
    }

    
/**
     * Cleans the DB from expired IPs
     *
     * @param bool $reduce_count if the counter should decrease for each expired IP
     * @return bool if the file could be found/open or not
     */
    
function clean_expired_ips($reduce_count=false)
    {
        if(!
file_exists($this->db))
        return 
false;

        if(
$this->expire==0)
        return 
true;

        
$data=file($this->db);
        
$ips=unserialize($data[1]);
        
$count=unserialize($data[2]);
        
$date=unserialize($data[3]);

        
$this->since_time=$date;

        
$new_array=array();
        
$modified=false;

        foreach (
$ips as $key=>$date)
        {
            if((
time()-$date)<$this->expire)
            
$new_array[$key]=$date;
            else
            {
                if(
$reduce_count)
                
$count--;
                
$modified=true;
            }
        }

        if(
$modified)
        {
            
$flat_file="<?php /* \n".serialize($new_array)."\n".serialize($count)."\n".serialize($this->since_time)."\n */ ?>";

            
$fp=fopen($this->db,"w");

            if(!
$fp)
            return 
false;

            
fwrite($fp,$flat_file,strlen($flat_file));
            
fclose($fp);
        }
        return 
true;
    }

    
/**
     * Use this and forget about calling any other function
     * It is necessary that you initiate a class before calling
     *
     * @param bool $reduce_count if the counter should decrease for each expired IP
     * @return false,int False when DB couldn't be created/open or an int saying the number of visits on the DB.
     */
    
function auto($reduce_count=false)
    {
        if(!
file_exists($this->db)&&!$this->install())
        {
            return 
false;
        }

        
$this->clean_expired_ips($reduce_count);
        
$this->count();

        return 
$this->get_count();
    }

    
/**
     * Returns if the visitor was already counted
     * This function fills the value of $already_counted
     *
     * @return bool,null null when the DB doesn't exists
     */
    
function already_counted()
    {
        if(
$this->already_counted!==null)
        return 
$this->already_counted;

        if(!
file_exists($this->db))
        return 
null;

        
$data=file($this->db);
        
$ips=unserialize($data[1]);
        
$count=unserialize($data[2]);
        
$date=unserialize($data[3]);

        
$this->already_counted=isset($ips[$_SERVER['REMOTE_ADDR']]);
        
$this->count=$count;
        
$this->since_time=$date;
        
        return 
$this->already_counted;
    }
}
?>