Gereksinimler ve Ön Hazırlık
Bu otomasyonu kurmadan önce sunucu ortamınızın aşağıdaki kriterleri karşıladığından emin olmalısınız. Yanlış yapılandırılmış bir yedekleme sistemi, sunucu kaynaklarını tüketerek sitenizin yavaşlamasına neden olabilir.
- PHP 8.2 veya üzeri: Güncel güvenlik standartları ve performans iyileştirmeleri için gereklidir.
- WP-Cron Erişimi: WordPress'in zamanlanmış görevleri çalıştırabilmesi için sunucuda kısıtlı olmamalıdır.
- Yazma İzni: Yedekleme dosyalarının kaydedileceği dizinin (örneğin
/wp-content/backups/) yazılabilir olması gerekir. - mysqldump Erişimi: Veritabanı yedeği almak için sunucu seviyesinde bu komut satırı aracına ihtiyaç duyulur.
Güvenlik Uyarısı: Yedekleme dosyalarınızı asla web kök dizininin (public_html) içinde, doğrudan erişilebilir bir klasörde tutmayın. Eğer tutmak zorundaysanız, klasör içerisine bir .htaccess dosyası ekleyerek dışarıdan erişimi tamamen engelleyin.
Özel Yedekleme Dizininin Oluşturulması ve Güvenliği
Yedekleme dosyalarınızın güvenliği, yedeklemenin kendisinden daha önemlidir. İlk adım olarak, WordPress dizininiz dışında veya güvenli bir alt dizinde yedekleme klasörünü oluşturmalı ve erişimi kısıtlamalısınız.
Aşağıdaki kod parçası, wp-content içerisinde güvenli bir klasör oluşturur ve içine erişimi engelleyen bir .htaccess dosyası yerleştirir.
function create_secure_backup_directory() {
$upload_dir = wp_upload_dir();
$backup_dir = $upload_dir['basedir'] . '/private_backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
$htaccess_content = "deny from all";
file_put_contents($backup_dir . '/.htaccess', $htaccess_content);
}
}
create_secure_backup_directory();
Bu fonksiyon, WordPress'in wp_upload_dir() fonksiyonunu kullanarak güvenli bir yol belirler ve deny from all kuralı ile Apache sunucularında dizin listelemeyi ve dosya erişimini engeller.
WP-Cron ile Zamanlanmış Görev Tanımlama
WordPress'in yerleşik zamanlayıcısı olan WP-Cron, yedekleme işleminin arka planda belirli aralıklarla tetiklenmesini sağlar. Bu adımda, günlük bir yedekleme görevi planlayacağız.
if (!wp_next_scheduled('daily_custom_backup_event')) {
wp_schedule_event(time(), 'daily', 'daily_custom_backup_event');
}
add_action('daily_custom_backup_event', 'run_custom_backup_process');
function run_custom_backup_process() {
// Yedekleme mantığı buraya gelecek
error_log('Yedekleme süreci başlatıldı.');
}
wp_schedule_event fonksiyonu, daily_custom_backup_event adında bir kanca (hook) oluşturur ve bunu günlük periyoda ayarlar. add_action ile bu kanca tetiklendiğinde çalışacak fonksiyonu bağlıyoruz.
Veritabanı Yedeği Alma ve Sıkıştırma
Veritabanı yedeği, WordPress'in en kritik verilerini içerir. PHP'nin exec() fonksiyonunu kullanarak sunucudaki mysqldump komutunu çağıracağız. Bu yöntem, büyük veritabanlarında PHP belleğini tüketmeden hızlı sonuç verir.
function perform_db_backup($backup_path) {
$db_name = DB_NAME;
$db_user = DB_USER;
$db_pass = DB_PASSWORD;
$db_host = DB_HOST;
$filename = $backup_path . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql.gz';
$command = "mysqldump -h $db_host -u $db_user -p$db_pass $db_name | gzip > $filename";
exec($command);
}
Burada dikkat edilmesi gereken nokta, mysqldump komutunda şifrenin doğrudan komut satırına yazılmasıdır. Güvenli bir ortamda, veritabanı bilgilerini çevre değişkenlerinden (environment variables) çekmek daha güvenli bir yaklaşımdır.
Dosya Sistemi Yedekleme ve Arşivleme
Veritabanı kadar, wp-content/uploads gibi dizinlerdeki dosyalarınız da değerlidir. PHP'nin ZipArchive sınıfını kullanarak bu dosyaları sıkıştırılmış bir arşiv haline getirebiliriz.
function backup_files_to_zip($source, $destination) {
$zip = new ZipArchive();
$zip->open($destination, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
}
Bu fonksiyon, belirtilen dizini yinelemeli (recursive) olarak tarar ve tüm dosyaları bir ZIP arşivine ekler. RecursiveIteratorIterator kullanımı, büyük dizin yapılarında bellek dostu bir tarama sağlar.
Yedekleme Yöntemlerinin Karşılaştırması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Eklenti Kullanımı | Kolay kurulum, arayüz desteği | Ek yük (overhead), güvenlik açığı riski |
| Manuel mysqldump | Hızlı, düşük kaynak tüketimi | Teknik bilgi gerektirir |
| Özel PHP Otomasyonu | Tam kontrol, özelleştirilebilir | Bakım sorumluluğu geliştiricide |
Sıkça Sorulan Sorular
Yedekleme işlemi sunucumu yavaşlatır mı?
Evet, özellikle büyük veritabanlarında işlemci ve disk I/O kullanımı artabilir. Bu nedenle yedekleme görevlerini sitenizin trafiğinin en düşük olduğu gece saatlerine planlamanız önerilir.
Yedekleme dosyasının bozuk olup olmadığını nasıl anlarım?
Yedekleme fonksiyonunuzun sonuna bir kontrol mekanizması ekleyerek, oluşturulan dosyanın boyutunun 0 byte'tan büyük olup olmadığını kontrol edebilir ve hata durumunda kendinize e-posta gönderebilirsiniz.
Bu yöntemle tüm WordPress'i yedekleyebilir miyim?
Evet, ancak ana çekirdek dosyalarını (core files) yedeklemek yerine sadece veritabanı ve wp-content klasörünü yedeklemek yeterlidir; çünkü çekirdek dosyaları WordPress.org üzerinden her zaman tekrar indirilebilir.
Yedeklerimi bulut depolamaya nasıl gönderirim?
Bu kod örneği yerel yedekleme içindir. Buluta göndermek için AWS S3 SDK veya Google Drive API kütüphanelerini kullanarak run_custom_backup_process fonksiyonuna bir "upload" aşaması ekleyebilirsiniz.
Eski yedekleri nasıl otomatik silerim?
Yedekleme fonksiyonunuzun başına, glob() fonksiyonu ile yedek klasöründeki dosyaları listeleyen ve filemtime() fonksiyonu ile 30 günden eski olanları unlink() ile silen bir temizleme mantığı ekleyebilirsiniz.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce mutlaka bir geliştirme (staging) ortamında test edin. Kodların yanlış yapılandırılması veri kaybına yol açabilir. Veri güvenliği konusunda uzman desteği almanız önerilir.
Yedekleme Süreçlerinde Hata Ayıklama ve Loglama Mekanizmaları
Otomasyon sistemleri arka planda sessizce çalıştığı için, bir yedekleme görevinin başarısız olması durumunda bunu fark etmeniz zor olabilir. Profesyonel bir yaklaşım, her yedekleme işleminin sonucunu bir log dosyasına yazdırarak süreci izlenebilir kılmaktır. Aşağıdaki kod bloğu, yedekleme scriptinize entegre edebileceğiniz basit bir loglama fonksiyonunu göstermektedir.
function log_backup_status($message, $type = 'INFO') {
$log_file = WP_CONTENT_DIR . '/backups/backup_log.txt';
$timestamp = date('Y-m-d H:i:s');
$formatted_message = "[$timestamp] [$type] $message" . PHP_EOL;
// Dosyaya ekleme yap
error_log($formatted_message, 3, $log_file);
}
// Kullanım örneği:
if ($backup_success) {
log_backup_status("Yedekleme başarıyla tamamlandı: " . $filename);
} else {
log_backup_status("Yedekleme başarısız oldu!", "ERROR");
}
Bu loglama sistemi sayesinde, wp-content/backups/backup_log.txt dosyasını düzenli kontrol ederek sistemin sağlığını takip edebilirsiniz. Ayrıca, kritik hatalarda e-posta bildirimi almak için wp_mail() fonksiyonunu hata bloğuna eklemeniz, olası veri kayıplarını önceden fark etmenizi sağlar.
Yedekleme Performansını Optimize Etme
Büyük boyutlu veritabanlarında veya binlerce dosyadan oluşan medya kütüphanelerinde yedekleme işlemi, sunucu kaynaklarını (CPU ve RAM) yoğun bir şekilde tüketebilir. Bu durum, yedekleme sırasında sitenizin yavaşlamasına veya 504 Gateway Timeout hatalarına yol açabilir. Performansı optimize etmek için aşağıdaki stratejileri uygulayabilirsiniz:
- Veritabanı Dışlamaları: Gereksiz tabloları (örneğin:
wp_optionsiçindeki geçici veriler veya istatistik eklentilerinin tabloları) yedekleme kapsamından çıkarın. - Parçalı Yedekleme: Dosya sistemini yedeklerken tüm dizini tek seferde sıkıştırmak yerine, dizinleri gruplandırarak yedekleyin.
- Nice Komutu Kullanımı: Eğer sunucunuz Linux tabanlıysa, yedekleme işlemini daha düşük öncelikle çalıştırmak için
nicekomutunu kullanın.
Aşağıdaki örnek, nice komutu ile sistem kaynaklarını daha verimli kullanmanızı sağlar:
// PHP exec fonksiyonu ile nice kullanımı
$command = "nice -n 19 tar -czf " . $backup_path . " " . $source_dir;
exec($command, $output, $return_var);
if ($return_var !== 0) {
log_backup_status("Arşivleme sırasında hata oluştu. Kod: " . $return_var, "ERROR");
}
Bu yöntem, sunucunun diğer işlemlere (ziyaretçilerin siteye erişimi gibi) öncelik vermesini sağlar ve yedekleme sürecinin sitenizin kullanıcı deneyimini olumsuz etkilemesini engeller. Özellikle paylaşımlı hosting (shared hosting) ortamlarında bu tür bir kısıtlama, sunucu sağlayıcınız tarafından hesabınızın askıya alınmasını önlemek için hayati önem taşır.
Sonuç
Wordpress ile özel bir dinamik veri yedekleme otomasyonu kurmak, sitenizin veri güvenliğini profesyonel bir seviyeye taşımanızı sağlar. Bu rehberde öğrendiğiniz WP-Cron kullanımı, mysqldump entegrasyonu ve dosya arşivleme teknikleri, eklenti bağımlılığınızı azaltarak size tam kontrol sunar. Bir sonraki adım olarak, bu yedekleri güvenli bir uzak sunucuya veya bulut depolama servisine otomatik olarak aktaran bir "Remote Storage" modülü geliştirmeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz