PHP + Chart.js ile Gerçek Zamanlı Admin İstatistik Paneli — Trafik, Video, Üye Büyüme
Merhaba,
PHP tabanlı kendi video/blog siteme yönetim paneli geliştirirken en çok ihtiyaç duyduğum şeylerden biri gerçek zamanlı istatistik ekranıydı. Google Analytics gibi dışarıya bağımlı olmak yerine veritabanımdan direkt çeken, sayfayı her açtığımda anlık durum gösteren bir panel istedim. Sonuç olarak ortaya çıkan stats.php'yi sizinle paylaşıyorum.
Ne gösteriyor?
Tek sayfada dört farklı bölüm var:
1. Günlük Özet (4 kart) — Bugünkü sayfa görüntüleme, unique ziyaretçi, video izlenme ve arama sayısı. Her kartta dünle karşılaştırma var, artış yeşil ↑ eksi kırmızı ↓ gösteriyor.
2. Trafik Grafikleri — Bugünün saatlik trafik dağılımı (bar grafik) ve son 30 günün günlük trafik trendi (alan grafik). Sayfa görüntüleme ve unique ziyaretçi ayrı ayrı çiziliyor.
3. Trend Videolar + Popüler Aramalar — O gün en çok izlenen 10 video (thumbnail'li liste) ve tüm zamanlardaki en çok aranan 15 kelime yan yana gösteriliyor.
4. Üye Büyüme Bölümü — Toplam üye, seçili dönemde yeni kayıt, bugün yeni kayıt, günlük ortalama kayıt kartları. Altında günlük yeni kayıt (bar) + kümülatif büyüme (çizgi) birleşik grafiği ve üye rol dağılımı pasta grafiği var (admin, moderator, vip, user...).
━━━━━━━━━━ EKRAN GÖRÜNTÜSÜ ━━━━━━━━━━
Alıntı:
📊 Bugün: 4.821 sayfa görüntüleme | 1.204 unique ziyaretçi | 893 video izlenme | 317 arama
📈 Son 30 gün trend grafik — Chart.js ile çiziliyor
🔥 Trend videolar — thumbnail + izlenme sayısı
👥 Toplam üye: 12.540 | Bugün yeni: 47 | Günlük ort: 38
🥧 Rol dağılımı pasta grafiği (admin / moderator / vip / user)
|
━━━━━━━━━━ VERİTABANI YAPISI ━━━━━━━━━━
Kod çalışabilmesi için veritabanında şu tabloların olması gerekiyor:
Kod:
-- Günlük/saatlik trafik tablosu
CREATE TABLE site_stats (
id INT AUTO_INCREMENT PRIMARY KEY,
stat_date DATE NOT NULL,
stat_hour TINYINT NOT NULL DEFAULT 0,
page_views INT NOT NULL DEFAULT 0,
unique_ips INT NOT NULL DEFAULT 0,
video_views INT NOT NULL DEFAULT 0,
searches INT NOT NULL DEFAULT 0,
INDEX (stat_date)
);
-- Video izlenme log tablosu
CREATE TABLE video_views_log (
id INT AUTO_INCREMENT PRIMARY KEY,
video_id INT NOT NULL,
view_date DATE NOT NULL,
INDEX (view_date),
INDEX (video_id)
);
-- Arama log tablosu
CREATE TABLE search_log (
id INT AUTO_INCREMENT PRIMARY KEY,
query VARCHAR(255) NOT NULL,
count INT NOT NULL DEFAULT 1,
UNIQUE KEY (query)
);
-- Kullanıcı tablosu (mevcut tablona göre uyarla)
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role VARCHAR(30) NOT NULL DEFAULT 'user',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX (created_at),
INDEX (role)
);
-- Video tablosu (mevcut tablona göre uyarla)
CREATE TABLE videos (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
thumbnail VARCHAR(500),
category VARCHAR(100)
);
━━━━━━━━━━ KURULUM ━━━━━━━━━━
1. Tabloları oluştur
Yukarıdaki SQL'i kendi veritabanına çalıştır. Zaten users ve videos tablon varsa onları kullan, yoksa oluştur.
2. Dosyayı yükle
admin/stats.php olarak admin klasörüne yükle. Kod
_layout.php ve
stats_helper.php dosyalarına bağımlı — bunlar kendi admin iskeletin varsa uyarla, yoksa aşağıda sade bir alternatif gösteriyorum.
3. Bağımlılıkları uyarla
Dosyanın en üstündeki 3 satırı kendi sisteminize göre düzenle:
Kod:
require_once '_layout.php'; // kendi admin header/footer dosyan
require_once '../stats_helper.php'; // yardımcı fonksiyonlar (require_perm vs)
global $db; // PDO bağlantı nesnesi
require_perm() fonksiyonu kendi yetki sisteminle çalışıyor. Eğer yoksa şu şekilde bypass edebilirsin:
Kod:
// Geçici bypass — kendi auth kontrolünle değiştir
function require_perm($perm) {
if (empty($_SESSION['admin_logged_in'])) {
header('Location: login.php'); exit;
}
}
4. Chart.js CDN
Grafiklerin çalışması için internet bağlantısı yeterli, dosyanın sonunda zaten şu satır var:
Kod:
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js"></script>
Offline sunucuda kullanacaksan Chart.
js'i indirip local path olarak değiştir.
5. Saatlik veriyi kaydetmek için cron
Trafik verisinin birikmesi için her saatte bir şu sorguyu çalıştıran bir cron job veya middleware gerekilir. Örnek cron satırı:
Kod:
0 * * * * php /var/www/html/cron/log_stats.php
6. Özet ve önemli kurulum bilgisi
Kod:
Zip içinde 3 dosya var:
Kod:
stats.php — Temizlenmiş ana dosya. Harici _layout.php ve stats_helper.php bağımlılıkları kaldırıldı, kendi HTML/CSS/JS'i var, standalone çalışıyor. Arrow function syntax PHP 7.4 uyumlu hale getirildi.
db.php — config/db.php olarak yükle, içine kendi host/dbname/user/pass bilgilerini yaz. stats.php bunu require ediyor.
stats_kurulum.sql — phpMyAdmin'e import et, 5 tabloyu oluşturuyor. Zaten mevcut users veya videos tablonuz varsa o CREATE bloklarını atlayın.
Kurulum sırası: SQL → db.php'yi doldur → stats.php'yi admin/ klasörüne yükle → tarayıcıdan aç.
━━━━━━━━━━ ÖZELLIKLER ━━━━━━━━━━
- Gerçek zamanlı: Sayfa her açıldığında veritabanından anlık çeker, cache yok.
- Dün karşılaştırması: Bugünkü sayfa görüntüleme ve unique ziyaretçi dünle otomatik karşılaştırılıyor, artış/azalış renkli gösteriliyor.
- Ayarlanabilir dönem: Üye büyüme grafiğinde URL parametresiyle dönem seçilebiliyor. Örnek: stats.php?ur=7 son 7 günü, stats.php?ur=90 son 90 günü gösteriyor. Minimum 7, maksimum 90 gün, varsayılan 30 gün.
- Kümülatif büyüme: Günlük yeni kayıtların yanında toplam üye sayısının nasıl büyüdüğünü gösteren kümülatif çizgi grafiği mevcut.
- Rol dağılımı: Üyelerin admin / co-admin / moderator / vip / user olarak kaçar kişi olduğunu yüzde ve pasta grafikle gösteriyor.
- Trend videolar: O gün video_views_log tablosuna en çok kayıt düşen 10 videoyu thumbnail'li şekilde sıralıyor.
- Hata toleransı: Her sorgu ayrı try/catch bloğunda. Bir tablo yoksa veya sorgu patlarsa sayfa tamamen çökmüyor, sadece o bölüm boş kalıyor.
━━━━━━━━━━ GEREKSİNİMLER ━━━━━━━━━━
- PHP 7.4 veya üzeri (arrow function syntax için)
- PDO + PDO_MySQL extension
- MySQL 5.7 / MariaDB 10.3 veya üzeri
- Chart.js 4.x (CDN üzerinden yükleniyor, kurulum gerektirmez)
━━━━━━━━━━ EKLER ━━━━━━━━━━
stats_panel dosyalarını zip olarak yüklüyorum. Veritabanı tablo yapısı ve require_perm() gibi bağımlılıkları kendi sisteminize göre uyarlamanız gerekiyor, geri kalan her şey standart PDO ile direkt çalışıyor.
Test ortamı: PHP 8.2 / MariaDB 10.6 / Chart.js 4.4.1. PHP 7.4 altında arrow function (fn() =>) syntax hatası verir, o durumda function($x) { return ...; } şeklinde dönüştürmeniz gerekir.