Сжатие изображений - получение размера изображения PHP
У меня есть скрипт, который рекурсивно перебирает все подкаталоги и сжимает все файлы jpeg. Я печатаю размер файла до и после сжатия, но он печатает один и тот же номер. Сценарий, который я запускаю, выглядит следующим образом:
set_time_limit (86000);
ob_implicit_flush(true);
$main = "files";
function readDirs($main){
$dirHandle = opendir($main);
while($file = readdir($dirHandle)){
$newFile = $main.'/'.$file;
if(is_dir($newFile) && $file != '.' && $file != '..'){
readDirs($newFile);
}
else{
if($file != '.' && $file != '..' && stristr($newFile,'.jpg'))
{
//echo $newFile.'</br>';
$img = imagecreatefromjpeg($newFile);
echo 'Compressing '.$newFile.'... from ('.filesize($newFile).' bytes) to (';
imagejpeg($img,$newFile, 30);
echo filesize($newFile).' bytes)...<br>';
for($k = 0; $k < 40000; $k++)
echo ' '; // extra spaces to fill up browser buffer
}
}
}
}
И результат, который я получаю, таков:
Сжатие files/1013/0079/3180/Beautifully_renovated_garden_apartment_in_Rehavia_7.JPG ... от (58666 байт) до (58666 байт)... Сжатие files/1013/0088/0559/Exquisite_stand_alone_house_in_Givat_Hamivtar_exceptional_views_3.JPG ... от (49786 байт) до (49786 байт)... Сжатие files/1013/0088/0587/Exquisite_stand_alone_house_in_Givat_Hamivtar_exceptional_views_6.JPG ... от (18994 байт) до (18994 байт)... Сжатие files/1013/0138/4914/Beautiful_4_rooms_apartment_with_views_to_the_Old_City_2.JPG ... от (527801 байт) до (527801 байт)... Сжатие files/1013/0208/0656/Fevrier_2011_005.JPG ...из (35607 байт) для (35607 байт)... Сжатие files/1013/0216/6078/Beautiful_townhouse_in_the_heart_of_the_German_Colony_00.JPG ... от (42509 байт) до (42509 байт)... Сжатие files/1013/0217/1359/Unique_luxurious_new_penthouse_in_the_heart_of_the_German_Colony_028.jpg ... от (1101251 байт) до (1101251 байт)... Сжатие files/1013/0269/0299/Exclusive_Duplex_Penthouse_in_the_German_Colony_0171.jpg ... от (20912 байт) до (20912 байт)... Сжатие files/1013/0821/0299/Beautiful_views_to_the_Knesset_and_Gan_Saker_016.JPG ... от (570428 байт) до (570428 байт)... Сжатие files/1013/0822/0660/Beautiful_new_penthouse_in_luxurious_building_with_pool_158double.jpg ... от (1020561 байт) до (1020561 байт)... Сжатие files/1013/0847/8190/New_luxurious_penthouse_with_private_entrance_in_Old_Katamon_016.JPG ... от (542071 байт) до (542071 байт)... ... ... ...
Может кто-нибудь сказать мне, в чем проблема? Почему размер не обновляется?
Большое спасибо!
2 answers
filesize()
использует механизм кэширования ("кэш статистики"), у которого может не хватить времени для обновления между двумя вызовами.
Используйте clearstatcache()
, чтобы принудительно обновить кэш.
Функция filesize() кэширует размер каждого файла, чтобы предотвратить довольно медленные системные вызовы stat(). Он содержит внутренний размер файла для данного имени файла, чтобы быстрее реагировать на новые вызовы.
Как и предлагалось, вам нужно вызвать clearstatcache(), чтобы получить правильные результаты. Если вы используете PHP>=5.3.0, вы также можете указать часть кэша, которую необходимо очистить.
Ваш код должен выглядеть следующим образом:
echo 'Compressing '.$newFile.'... from ('.filesize($newFile).' bytes) to (';
imagejpeg($img,$newFile, 30);
clearstatcache(true, $newFile); // or clearstatcache() if you want to flush the whole cache
echo filesize($newFile).' bytes)...<br>';
Я надеюсь, что это то, что вы ищете.