Сжатие изображений - получение размера изображения 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 байт)... ... ... ...

Может кто-нибудь сказать мне, в чем проблема? Почему размер не обновляется?

Большое спасибо!

Author: Meir, 2012-06-08

2 answers

filesize() использует механизм кэширования ("кэш статистики"), у которого может не хватить времени для обновления между двумя вызовами.

Используйте clearstatcache(), чтобы принудительно обновить кэш.

 1
Author: Pekka 웃, 2012-06-08 11:10:08

Функция 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>';

Я надеюсь, что это то, что вы ищете.

 1
Author: thebod, 2012-06-08 11:14:52