MongoDB, temel olarak dosya depolaması için tasarlanmamış olsa da, özellikle GridFS kullanıldığında, daha geniş bir uygulama bağlamında dosyaları yönetmek için geçerli bir seçenek olabilir. Bu yaklaşım, ölçeklenebilirlik ve dosya yönetimini mevcut MongoDB sorgularıyla entegre etme olanağı gibi avantajlar sunar. Bununla birlikte, özel dosya depolama çözümlerinin büyük ölçekli dosya yönetimi için daha iyi performans ve özellikler sağladığını kabul etmek çok önemlidir. Bu kılavuz, PHP’de MongoDB ve GridFS’nin dosya depolaması için nasıl kullanılacağını göstermektedir.
İçindekiler
Önkoşullar
Devam etmeden önce, şunlara sahip olduğunuzdan emin olun:
- Çalışan bir MongoDB örneği.
- MongoDB sürücüsü yüklenmiş PHP (
pecl install mongodb
). - PHP ve MongoDB kavramları hakkında temel bir anlayış.
- Bağımlılık yönetimi için Composer (önerilir).
GridFS’i Anlamak
GridFS tek bir koleksiyon değil, iki koleksiyon kullanan bir mekanizmadır:
fs.files
: Dosya meta verilerini (dosya adı, yükleme tarihi, içerik türü, uzunluk) depolar.fs.chunks
: BSON belge boyutu sınırını aşan dosyaları işlemek için parçalara ayrılmış dosya verilerini depolar.
PHP’de Uygulama
Resmi MongoDB PHP sürücüsünü kullanacağız. Veritabanı ve dosya yolları gibi yer tutucuları kendi gerçek değerlerinizle değiştirmeyi unutmayın.
Dosya Yükleme
selectDatabase('your_database_name'));
$file = fopen('path/to/your/file.txt', 'r');
try {
$upload = $bucket->uploadFromStream(
'your_file_name.txt',
$file,
[
'contentType' => 'text/plain',
'metadata' => ['author' => 'Your Name']
]
);
echo "Dosya ID: " . $upload->getId() . " ile yüklendi.";
} catch (MongoDBDriverExceptionException $e) {
echo "Dosya yükleme hatası: " . $e->getMessage();
} finally {
fclose($file);
}
?>
Dosya İndirme
selectDatabase('your_database_name'));
try {
$download = $bucket->downloadById($fileId);
$file = fopen('path/to/download/location.txt', 'w');
stream_copy_to_stream($download->getStream(), $file);
echo "Dosya başarıyla indirildi.";
} catch (MongoDBDriverExceptionException $e) {
echo "Dosya indirme hatası: " . $e->getMessage();
} finally {
fclose($file);
}
?>
Dosya Silme
selectDatabase('your_database_name'));
try {
$bucket->delete($fileId);
echo "Dosya başarıyla silindi.";
} catch (MongoDBDriverExceptionException $e) {
echo "Dosya silme hatası: " . $e->getMessage();
}
?>
Dosyaları Listeleme
selectDatabase('your_database_name')->selectCollection('fs.files');
try {
$cursor = $filesCollection->find();
foreach ($cursor as $file) {
echo "Dosya Adı: " . $file->filename . ", ID: " . $file->_id . "n";
}
} catch (MongoDBDriverExceptionException $e) {
echo "Dosyaları listeleme hatası: " . $e->getMessage();
}
?>
Dikkat Edilmesi Gerekenler
- Hata İşleme: Örnekler temel hata işleme içerir. Üretim kodu daha sağlam hata kontrolleri ve günlüğü gerektirir.
- Büyük Dosyalar: Çok büyük dosyalar için, en uygun performans için parça boyutunu ayarlayın.
- Güvenlik: Depolanan dosyaları korumak için kimlik doğrulama ve yetkilendirme uygulayın.
- Alternatifler: Birçok durumda daha iyi ölçeklenebilirlik ve performans için özel dosya depolama hizmetlerini (AWS S3, Google Cloud Storage, Azure Blob Storage) göz önünde bulundurun.
Sonuç
Bu kılavuz, PHP’de dosya depolaması için MongoDB ve GridFS kullanımı konusunda temel bir bilgi sağlar. Üretim ortamına hazır bir çözüm için kodu uyarlamayı ve kapsamlı hata işleme ve güvenlik önlemleri uygulamayı unutmayın. Belirli ihtiyaçlarınız için özel bir dosya depolama hizmetinin daha uygun bir seçim olup olmadığını her zaman göz önünde bulundurun.