PHP Classes

File: x64_simple_counter.php

Recommend this page to a friend!
  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: 17 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;
    }
}
?>