Daha önce kendi php uygulamamda kullandığım bir file handling kodlamasını sizlerle paylaşmak istedim. PHP dosya sistemi üzerinde file_get_contents()
ve scan_dir()
gibi listeleme yapmanıza olanak tanıyan işlevleri barındırıyor ama bir adım sonrasında dosya sistemi şişmeye başlayınca, PHP'nin kendi sağladığı fonksiyonlar performans açısından ne yazık ki yetersiz kalıyor.
Dosyaları sunucuyu yormadan handle etmek için PHP'nin Iterable nesnelerini kullanmamız gerekiyor. İlk olarak dizin taraması için Symfony Finder kullanacağız ve daha sonra aldığımız dizin bilgisine göre dosyaları Iterable nesnemiz ile yineleyeceğiz.
<?php
use Symfony\Component\Finder\Finder as SymfonyFinder;
$finder = new SymfonyFinder();
$finderX = $finder
->files()
->in('files/path') // Aranacak dizin
->path('/subdirectory/') // Alt dizinleri filtreler (regex ile belirtebilirsin)
->name('*.txt') // Dosya isimlerini filtreler (örneğin, .txt uzantılı dosyalar)
->date('since 1 day ago') // Değiştirilme tarihine göre filtreler (örneğin, son 1 gün içinde değiştirilen dosyalar)
->depth('< 2') // Dizinin derinliğini filtreler (örneğin, sadece belirtilen dizin ve bir alt dizin)
->sortByChangedTime(); // Değiştirilme zamanına göre sıralar
// Burada SymfonyFinder'ın Iterator nesnesini alıyoruz.
$iterator = $finderX->getIterator();
// Toplam media sayısı
$mediaCount = $iterator->count();
Şimdi burada örneğin "1000" adet dosyamız varsa Finder bunları getirecek. Ancak bunların arasından bir de "Limitation" koymamız lazım. Yani bu liste içerisindeki hangi aralıktaki dosyaları istiyoruz. Mesela eklenme tarihine göre dosyaları çektik. Ama baştan itibaren 40'ar adet gelecek şekilde bir "Pagination" eklememiz gerekecek.
function formatSizeUnits($bytes) {
if ($bytes >= 1073741824) {
$size = number_format($bytes / 1073741824, 2) . ' GB';
} elseif ($bytes >= 1048576) {
$size = number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
$size = number_format($bytes / 1024, 2) . ' KB';
} elseif ($bytes > 1) {
$size = $bytes . ' bytes';
} elseif ($bytes == 1) {
$size = $bytes . ' byte';
} else {
$size = '0 bytes';
}
return $size;
}
// Dosya aralığı limiti
$fileLimit = 40;
// Dosya aralığı başlangıcı
$filesStart = 0;
// Dosya Listesi
$fileList = [];
$splFileInfo = new \LimitIterator($iterator, $filesStart, $fileLimit);
foreach ($splFileInfo as $file) {
$fileList[] = [
'name' => $file->getFilename(),
'size' => formatSizeUnits($file->getSize()),
'type' => mime_content_type($file->getRealPath()),
];
}
var_export($fileList);
Bu şekilde ayarladığımızda artık PHP tarafında sunucuya ağır bir yük bindirmemiş olacağız ve istediğimiz dosya aralığını sağlıklı bir şekilde alabileceğiz.
🔥 Yorumlar