pillinetwork hesabınızla giriş yapın.

Php ve SQLite ile Online Ziyaretçi

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?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. Önceliklekullanılmak istenen sunucuda SQLite kütüphanesinin kurulu olupolmadığı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ıpsonra yaratılan bu veritabanı içine ziyaretçiler adında bir tabloyaratıyoruz. Yok eÄŸer veritabanı mevcut ise veritabanı baÄŸlantısınıgerçekleÅŸtiriyoruz. $this->db = newSQLiteDatabase(database,mode,errormsg); diyerek. Burdaki 0666 read-onlymodunda açılması demektir. errormsg ise herhangi bir hata olduÄŸundaerror mesajı bu deÄŸiÅŸkene aktarılır.
  • Zaman aşımı sil metotunda ise belirttiÄŸimiz zaman aralığından dahafazla süredir pasif durumda olan kayıtları siliyoruz. BöylecebelirttiÄŸimiz zaman dilimi içindeki online kullanıcıların sayısını eldeediyoruz.
  • Zaman güncelle metotumuz ile de öncelikle aktif olan ziyaretçilerinip adresleri sistem de kayıtlı mı diye bakıyoruz eÄŸer deÄŸil ise sistemezaman olarak time() formatını kullanarak ekliyoruz. Yok sistem de zatenvar ise ip adresini koÅŸul alarak o ip ye ait zaman alanını ÅŸimdikizaman ile güncelleyerek sitedeki aktifliÄŸini koruyoruz.
  • Ziyaretci toplam metotumuzda ise zaten adında anlaşılacağı gibisistemdeki belirttiÄŸimiz zaman aralığını aÅŸmamış kullanıcıların toplamsayısını alıyoruz.
  • Ziyaretci göster metodunda ise yukarıdaki metotlarımızı bununiçinde çağırıyoruz öncelikle zaman aşımına uÄŸramış ziyaretçilerisiliyoruz ardından zaman güncelle metodunu çağırarak yukardakibahsettiÄŸim olayı gerçekleÅŸtirip en sade haliyle aktif ziyaretçileribelirleyip 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 $timeoutdeğerini belirtiyoruz. Standart timeout değer 1 dakikadir Bunlarıyaptıktan sonra aşağıdaki örnekdeki gibi kullanabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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.

Spacer
Spacer
/* RaidenCeviz yazdı. 24 Nisan 2009 14:55. 10 yorum var */

Yorumlar

yazı güzel bir sistemi asp.net ' de yazmıştım isteyen olursa paylaşabilirim.
ama hile yapmışsın abi :) sayılmaz bu veri tabanı veri tabanıdır :)

sqllite de iyimiş bu arada. keşke uygulama bazlı kısa süreli de olsa değişkenlerimiz olsa.chace gibi işlerde session gibi kullanabilsek. güzel olurdu.

asp de bunu application ile yapmışlar tabi application nedir ne değildir bilemiyorum ama session ile olcak bişey değil sonuçta session her bilgisayar için özel olarak açılır... Ben burda bir txt vs yerine sqlite kullandım yapcak bişey yok :)

Güzel yazı olmuş teşekkür ederim

/* Mutluluk çanları çalıyor... */

faydalı olduysa ne ala..

selamlar.. güzel bir yazı olmuş..
yanlış anlamayın ama kişisel görüşüme göre online ziyaretçi gibi basit bir sistemde class kullanımına gerek yok .. sakın yanlış anlamayın.. bu benim düşüncem :)

/* www.DjarumTurk.net */

@Serhat7
fonksiyon yapıp kullanabilirsiniz veya inline kodda yazabilirsiniz. burda yazıklarımız örneklerden ibaret...

klasik asp'de application server bazında değişken oluşturmamızı sağlıyor ve tıpkı session gibi değişkenlerin bir ölüm süresi oluyor.

Sitedeki online ziyaretçi sayısı için global.asa dosyası kullanılır. IIS kendine bir istek geldiğinde ilk olarak bu özel dosyayı arar. Bulursa önce onu işletir. Zaten tüm özelliği de budur. Bu dosya içerisine application nesnesi uygun şekilde programlandığı takdirde online kişi sayısını elde edebiliyoruz. Tabii bu anlatılanlar sadece klasik asp içindir Asp.net ile ilgisi yoktur.

Ayrıca anlattığım yöntemde yapılacak kodlama max. 5-10 satır sürer. Online kişi sayısı lazım oldukça <%=application("online")%> şeklinde yazdırabiliyoruz.

Yusuf güzel olmuş, sqlite yönünde
teşekkürler

/* twitter */

Güzel yazı olmuş Yusuf hocam teşekkürler. Ayrıca zekice davranmışsınız mysql olmazsa başkası olur :) patron hiçbir veritabanı kullanılmayacak dese neysede.

/* Burak Sırrı Vanlı */

BeÄŸenmenize sevindim.

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork