Tek dosya entegrasyonu ile profesyonel düzeyde web analitik çözümü
Giriş
Web sitesi sahiplerinin en temel ihtiyaçlarından biri, sitelerini kimlerin ziyaret ettiğini anlık olarak görmek ve analiz edebilmektir. Google Analytics gibi üçüncü parti servisler güçlü çözümler sunsa da, verilerinizin kendi sunucunuzda kalmasını istediğiniz durumlar, özel gereksinimler veya basitçe bağımsız bir çözüm arayışı sizi kendi sisteminizi geliştirmeye yönlendirebilir.
Bu makalede, PHP ile sıfırdan geliştirdiğimiz Ziyaretçi Takip Sistemi v4.0'ı inceliyoruz. Sistem; gerçek zamanlı online takip, GeoIP konum tespiti, IP engelleme, SPA uyumlu heartbeat mekanizması ve en önemlisi SQLite ile MySQL arasında kesintisiz geçiş yapabilme yeteneğine sahip bir PDO tabanlı çözümdür.
Mimari Tasarım: Dual-Driver Yaklaşımı
Sistemin en kritik tasarım kararı, veritabanı soyutlama katmanıdır. Doğrudan SQLite3 sınıfı veya mysqli kullanmak yerine, PDO (PHP Data Objects) tercih edilmiştir. Bu sayede tek bir kod tabanı ile her iki veritabanı motorunu desteklemek mümkün olmaktadır.
SQL Dialect Farklılıklarının Yönetimi
SQLite ve MySQL arasındaki SQL sözdizimi farkları, helper fonksiyonlarla soyutlanmıştır:
| İşlem | SQLite | MySQL |
|---|---|---|
| Tarih karşılaştırma | datetime('now','-300 seconds') |
DATE_SUB(NOW(), INTERVAL 300 SECOND) |
| Upsert | INSERT OR REPLACE |
ON DUPLICATE KEY UPDATE |
| Çakışma yönetimi | INSERT OR IGNORE |
INSERT IGNORE |
| Auto increment | AUTOINCREMENT |
AUTO_INCREMENT |
Bu farklılıklar dateExpr(), upsert() ve insertIgnore() gibi helper metodlarla yönetilmekte, böylece iş mantığı katmanı veritabanı motorundan tamamen bağımsız çalışmaktadır.
Konfigürasyon Yönetimi
Veritabanı seçimi data/db_config.json dosyasından okunmaktadır. Bu dosya mevcut değilse sistem otomatik olarak SQLite modunda başlar — sıfır konfigürasyon ile çalışır hale gelir. MySQL'e geçmek için admin panelinden bağlantı bilgileri girilir, test edilir ve tek tıkla geçiş yapılır.
{
"driver": "mysql",
"host": "localhost",
"port": "3306",
"database": "visitor_tracker",
"username": "root",
"password": "****"
}
Fallback Mekanizması
MySQL bağlantısı herhangi bir nedenle başarısız olursa (sunucu kapalı, şifre değişmiş vb.), sistem otomatik olarak SQLite'a düşer. Bu sayede site hiçbir zaman tamamen çökmez:
try {
if ($this->driver === 'mysql') {
$this->db = new PDO($dsn, $user, $pass, $options);
} else {
$this->initSQLite();
}
} catch (PDOException $e) {
// MySQL hata → SQLite fallback
if ($this->driver === 'mysql') {
$this->initSQLite();
}
}
Gerçek Zamanlı Online Takip
Sistemin en güçlü özelliklerinden biri, ziyaretçilerin hangi sayfada olduğunu anlık olarak görebilmektir. Bu, heartbeat mekanizması ile sağlanmaktadır.
Heartbeat Nasıl Çalışır?
Ziyaretçinin tarayıcısına otomatik olarak enjekte edilen bir JavaScript kodu, her 25 saniyede bir sunucuya "hâlâ buradayım" sinyali gönderir. Bu sinyal şu bilgileri taşır:
- Mevcut sayfa URL'si ve başlığı
- Ekran çözünürlüğü (ilk istekte)
- Sayfa geçişi mi yoksa kalma sinyali mi olduğu
SPA (Single Page Application) Uyumluluğu
React, Vue, Angular gibi framework'lerle yapılmış tek sayfa uygulamalarda sayfa geçişleri tam yükleme olmadan gerçekleşir. Sistem bunu yakalamak için birden fazla yöntemi dinler:
// Hash değişimi (#/sayfa)
window.addEventListener("hashchange", onRoute);
// Browser geri/ileri
window.addEventListener("popstate", onRoute);
// pushState / replaceState yakalama (React Router)
var origPush = history.pushState;
history.pushState = function() {
origPush.apply(this, arguments);
onRoute();
};
Veritabanı Şeması
Sistem 8 tablo kullanmaktadır ve her biri belirli bir sorumluluğa sahiptir:
| Tablo | Açıklama | Primary Key |
|---|---|---|
| visitors | Tekil ziyaretçiler (IP bazlı, GeoIP, tarayıcı bilgileri) | ip (UNIQUE) |
| page_views | Her sayfa görüntüleme kaydı | id (AUTO_INCREMENT) |
| online_visitors | Anlık aktif ziyaretçiler | ip |
| daily_stats | Günlük tekil ziyaretçi ve sayfa görüntüleme | date |
| hourly_stats | Saatlik trafik yoğunluğu | date_hour |
| settings | Sistem ayarları (key-value) | key |
| admins | Admin kullanıcıları | id |
| login_attempts | Brute-force koruması için giriş denemeleri | id |
Admin Paneli Özellikleri
Sistem, Bootstrap 5 ve Chart.js ile geliştirilmiş kapsamlı bir admin paneli içermektedir. Panel 5 ana sekmeden oluşur:
1. Dashboard
Günlük özet kartları (online sayısı, bugünkü tekil ziyaretçi, sayfa görüntüleme, toplam ziyaretçi), 7 günlük trafik grafiği ve saatlik yoğunluk çubuğu içerir. Tarayıcı, işletim sistemi, ülke ve cihaz dağılım grafikleri de bu sekmede yer alır.
2. Canlı Online
Ayarlanabilir aralıklarla (5-60 saniye) otomatik yenilenen tablo. Her ziyaretçinin IP'si, aktif sayfası, tarayıcı/cihaz bilgisi, konumu ve ne kadar süredir aktif olduğu görünür. Arama ve filtreleme desteği mevcuttur.
3. Ziyaretçiler
Tüm ziyaretçi geçmişi; sıralama, filtreleme (ülke, tarayıcı, OS, cihaz, tarih aralığı) ve CSV dışa aktarma özellikleriyle sunulur. Her ziyaretçinin detay sayfasında sayfa geçmişi, not ekleme ve IP engelleme bulunur.
4. İstatistikler
Konfigüre edilebilir zaman aralığında (7/30/90 gün) detaylı grafikler: trafik trendi, en çok ziyaret edilen sayfalar, referrer kaynakları ve coğrafi dağılım.
5. Ayarlar
Sistem konfigürasyonu, şifre değiştirme, veritabanı geçiş yönetimi (SQLite ↔ MySQL) ve özelleştirilebilir 403 engel sayfası düzenleyici (canlı HTML editör + anlık önizleme) bu sekmede yer alır.
IP Engelleme Sistemi
Sistem iki farklı engelleme modu sunmaktadır:
| Mod | Davranış |
|---|---|
| Erişimi Engelle | Engelli IP'ye özelleştirilebilir 403 sayfası gösterilir, siteye erişim tamamen kapatılır |
| Sadece Takip Etme | Engelli IP siteyi görebilir ancak istatistiklere dahil edilmez |
403 sayfası admin panelindeki HTML editör ile tamamen özelleştirilebilir — canlı önizleme ile yazılan HTML anında görüntülenir.
Kurulum ve Entegrasyon
Kurulum son derece basittir. Dosyaları sunucuya yükleyin ve herhangi bir PHP sayfasına tek satır ekleyin:
<?php include 'visitor-tracker/visitor_tracker.php'; ?>
Bu tek satır, otomatik olarak şunları yapar:
data/klasörünü ve veritabanını oluşturur (ilk çalıştırmada)- Ziyaretçiyi kaydeder ve GeoIP bilgisini çeker
- Sayfa görüntüleme ve istatistikleri günceller
- Heartbeat JavaScript'ini sayfaya enjekte eder
- Engelli IP kontrolü yapar (gerekiyorsa 403 gösterir)
- Bot tespiti ile gereksiz kayıtları filtreler
Admin paneline /visitor-tracker/admin/admin.php adresinden erişilir. Varsayılan giriş: admin / admin123 (ilk girişte değiştirmeniz önerilir).
SQLite vs MySQL: Ne Zaman Hangisi?
| Kriter | SQLite | MySQL |
|---|---|---|
| Kurulum | Sıfır konfigürasyon | Veritabanı oluşturulmalı |
| Eşzamanlı erişim | Tek yazıcı (WAL ile iyileştirilmiş) | Tam eşzamanlı destek |
| Trafik kapasitesi | Küçük-orta siteler | Yüksek trafikli siteler |
| Yedekleme | Tek dosya kopyala | mysqldump gerekli |
| Taşınabilirlik | Dosya kopyala çalışsın | Sunucu bağımlı |
Tavsiye: SQLite ile başlayın. Trafik arttığında ve SQLite kilitlenmeleri yaşamaya başladığınızda, admin panelinden tek tıkla MySQL'e geçin — verileriniz de otomatik aktarılır.
Güvenlik Önlemleri
- Brute-force koruması: 15 dakika içinde 5 başarısız giriş denemesi sonrası IP geçici olarak engellenir
- Şifre hashleme:
password_hash()ile bcrypt - SQL Injection koruması: Tüm sorgular PDO prepared statements kullanır
- XSS koruması: Tüm kullanıcı girdileri
htmlspecialchars()ile escape edilir - Bot filtreleme: 25+ bilinen bot user-agent'ı otomatik tespit ve hariç tutma
- Otomatik temizlik: Eski kayıtlar ayarlanan saklama süresine göre otomatik silinir
Sonuç
Bu ziyaretçi takip sistemi, tek bir include satırı ile herhangi bir PHP projesine entegre edilebilir. SQLite'ın basitliği ile başlayıp MySQL'in gücüne terfi edebilir, aradaki geçişte tek satır veri kaybetmezsiniz. Açık kaynak yapısı sayesinde ihtiyaçlarınıza göre özelleştirilebilir ve genişletilebilir.
Projenin tüm kaynak kodu iki dosyadan oluşmaktadır: visitor_tracker.php (backend motor) ve admin/admin.php (yönetim paneli). Harici bağımlılık yoktur — PHP'nin yerleşik PDO ve session desteği yeterlidir.
İndirme
Projenin son sürümünü aşağıdaki bağlantıdan indirebilirsiniz:
💬 Yorumlar (0)
İlk yorumu siz yapın!
💬 Yorum Yap