Merhaba canlarım :) diyorum şu bloğa düzenli yazı yazayım diye hep ama hiç de başarılı olamıyorum biraz da üşengecim heralde. Bugün bir arkadaşımın patronuyla iddialaşması üzerine beni de gaza getirmesi sebebiyle online ziyaretci sayısını bildiren bir betik yazmamı istedi. Bunu SESSION ile yapmamı istedi ama bu sessionla olacak bir iş değildi. Patronu da MySQL kullanımına izin vermeyince farklı bir veritabanı kullandık. Bu veritabanı SQLite idi. Kendisi php 5 ile gelen içerisine sql veritabanı motoru enjekte edilmiş c kütüphanesi olarak bilinir.

Madem ki mysql istemiyordu bende sqlite ile yapayım dedim ve başladım ufak bir betik yazmaya ve ortaya güzel bir nesne çıktı. SQLite hız vs açısından pek bişey diyemeceğim lakin fazlasıyla tatmin edeceğinden eminim. Ayrıca normal veritabanı olarakda kullanabilirsiniz uygulamalarınıza dahil edebilir yönetebilirsiniz. Gerçi biraz normal sql den farklı ama onu da sitesinden döküman okuyarak çözebilirsiniz.

Lafı fazla uzatmadan örneğimize geçelim ve bir hatırlatma ile devam edelim sqlite bir dosya oluşturur bu nedenle oluşacak dosyanın bulduğu dizinin yazma hakları verilmiş olmalıdır.

Online Ziyaretçi betiğimiz:

< ?php
 
/**
 * @author Yusuf Koç ( Raiden ) <raiden [at] ceviz dot net>
 * @copyright 2009
 * @filename online.ziyaretci.php
 * 
 *  Online Ziyaretçi Sınıfı v1.0
 * 
 * 	Kullanımı:
 * 
 *  $online_ziyaretci = new OnlineZiyaretci;
 *  echo $online_ziyaretci->ziyaretciGoster();
 *  
 *  Copyright 2009 ysfkc.com
 *  Licensed under the GNU General Public License, version 2.
 *  See the file http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 * 
 */
 
 
class OnlineZiyaretci
{
	const database = 'onlineziyaretci';
	const table = 'ziyaretciler';
	private $query;
	private $rows;
	private $db;
	private $process;
	private $msg;
	private $timeout = 1;
 
	/**
	 * Yapılandırıcı Fonksiyon 
	 * @access public
	 **/
	public function __construct()
	{
		if (function_exists('sqlite_open') === False)
		{
			exit('SQLite Kütüphanesi Yüklü Değil. Lütfen Aktif Ediniz.!');
		}
		else
		{
			if (file_exists(self::database) === False)
			{
				$this->db = new SQLiteDatabase(self::database,0666,$this->msg);
 
				if ($this->db === FALSE)
				{
					exit($this->msg);
				}
				else
				{
					$this->db->query("
					CREATE TABLE ".self::table." (ip varchar(15),konum varchar(255),zaman integer)
					");
				}
			}
			else
			{
				$this->db = new SQLiteDatabase(self::database);
			}
		}
	}
 
	/**
	 * Zaman Aşımına Uğraşmış Ziyaretçileri Tablodan Siler 
	 * @access private
	 **/
	private function zamanAsimiSil()
	{
		$this->process = time() - ($this->timeout * 60);
		$this->db->query("DELETE FROM ".self::table." WHERE zaman < ".$this->process."");
	}
 
	/**
	 * İpleri Kontrol Eder. Eğer ip kayıtlı değil ise kaydeder kayıtlı 
	 * ise zaman alanını şimdiki zaman ile günceller. 
	 * @access private
	 **/
	private function zamanGuncelle()
	{
		$this->process = time();
 
		$this->query = $this->db->query("SELECT ip FROM ".self::table." WHERE ip='".$_SERVER['REMOTE_ADDR']."'");
 
		if ($this->query->numRows() == 0)
		{
			$this->db->query("
				INSERT INTO ".self::table." (ip,konum,zaman) 
				VALUES ('".$_SERVER['REMOTE_ADDR']."','".$_SERVER['PHP_SELF']."','".$this->process."')
			");
		}
		else
		{
			$this->db->query("
				UPDATE ".self::table." SET zaman='".$this->process."' WHERE ip='".$_SERVER['REMOTE_ADDR']."'
			");
		}
 
	}
 
	/**
	 * Online ziyaretçi toplamını döndürür 
	 * @access private
	 **/
	private function ziyaretciToplam()
	{
		$this->query = $this->db->query("SELECT ip FROM ".self::table."");
		$this->rows = $this->query->numRows();
		return $this->rows;
	}
 
	/**
	 * Online ziyaretçi sayısını yazdırır 
	 * @access public
	 **/
	public function ziyaretciGoster()
	{
		$this->zamanAsimiSil();
		$this->zamanGuncelle();
		echo $this->ziyaretciToplam();
	}
}
?>

Online Ziyaretçi Sınıfımıza Göz Atalım:

  • Sınıfımız başlatılırken bir dizi işlemden geçiriliyor. Öncelikle kullanılmak istenen sunucuda SQLite kütüphanesinin kurulu olup olmadığına bakıyor eğer kurulu ise sınıfımızda belirtilen veritabanı adında bir dosya olup olmadığna bakıyor yok ise veritabanı yaratılıp sonra yaratılan bu veritabanı içine ziyaretçiler adında bir tablo yaratıyoruz. Yok eğer veritabanı mevcut ise veritabanı bağlantısını gerçekleştiriyoruz. $this->db = new SQLiteDatabase(database,mode,errormsg); diyerek. Burdaki 0666 read-only modunda açılması demektir. errormsg ise herhangi bir hata olduğunda error mesajı bu değişkene aktarılır.
  • Zaman aşımı sil metotunda ise belirttiğimiz zaman aralığından daha fazla süredir pasif durumda olan kayıtları siliyoruz. Böylece belirttiğimiz zaman dilimi içindeki online kullanıcıların sayısını elde ediyoruz.
  • Zaman güncelle metotumuz ile de öncelikle aktif olan ziyaretçilerin ip adresleri sistem de kayıtlı mı diye bakıyoruz eğer değil ise sisteme zaman olarak time() formatını kullanarak ekliyoruz. Yok sistem de zaten var ise ip adresini koşul alarak o ip ye ait zaman alanını şimdiki zaman ile güncelleyerek sitedeki aktifliğini koruyoruz.
  • Ziyaretci toplam metotumuzda ise zaten adında anlaşılacağı gibi sistemdeki belirttiğimiz zaman aralığını aşmamış kullanıcıların toplam sayısını alıyoruz.
  • Ziyaretci göster metodunda ise yukarıdaki metotlarımızı bunun içinde çağırıyoruz öncelikle zaman aşımına uğramış ziyaretçileri siliyoruz ardından zaman güncelle metodunu çağırarak yukardaki bahsettiğim olayı gerçekleştirip en sade haliyle aktif ziyaretçileri belirleyip son olarak da ekrana toplam ziyaretci sayısını yazdırıyoruz.

Sınıfımızı nasıl kullanacağız bir örnek ile hemen açıklayalım. Öncelikle yapmamız gereken şey betiğimizi açıp
const database = ‘onlineziyaretci’; ve const table = ‘ziyaretciler’; satırlarını kendimize göre değiştiriyoruz. Ardından ise $timeout değerini belirtiyoruz. Standart timeout değer 1 dakikadir Bunları yaptıktan sonra aşağıdaki örnekdeki gibi kullanabiliriz.

< ?php
# Öncelikle Sınıfımızı Dahil Ediyoruz.
# -----------------------------------
include_once('online.ziyaretci.php');
 
# Sınıfımızı Başlatıyoruz.
# ------------------------
$ziyaretci = new OnlineZiyaretci;
 
# Online Ziyaretcileri Yazdırıyoruz.
# --------------------------------------
echo $ziyaretci->ziyaretciGoster();
?>

Evet bir online ziyaretçi betiğinin anatomisi bu kadar :) betiği buradan indirebilirsiniz.