2012-06-08 2 views
2

У меня есть скрипт, который рекурсивно проходит через все вспомогательные каталоги и сжимает все jpeg. Я печатаю размер файла до и после сжатия, но он печатает тот же номер. Сценарий Я бегу это:Сжатие изображений - получить размер изображения PHP

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 
     } 
    } 
    } 
} 

И выход я получаю:

Сжимая файлов/1013/0079/3180/Beautifully_renovated_garden_apartment_in_Rehavia_7.JPG ... из (58666 байт) до (58666 байт) ... сжимающих файлов/1013/0088/0559/Exquisite_stand_alone_house_in_Givat_Hamivtar_exceptional_views_3.JPG ... из (49786 байт) до (49786 байт) ... сжимающих файлов/1013/0088/0587/Exquisite_stand_alone_house_in_Givat_Hamivtar_excep tional_views_6.JPG ... от (18994 bytes) до (18994 bytes) ... Сжатие файлов/1013/0138/4914/Beautiful_4_rooms_apartment_with_views_to_the_Old_City_2.JPG ... от (527801 bytes) до (527801 bytes) ... Сжимая файлов/1013/0208/0656/Fevrier_2011_005.JPG ... от (35607 байт) до (35607 байт) ... Сжимая файлы/1013/0216/6078/Beautiful_townhouse_in_the_heart_of_the_German_Colony_00.JPG ... из (42509 байты) до (42509 байт) ... Сжатие файлов/1013/0217/1359/Unique_luxurious_new_penthouse_in_the_heart_of_the_German_Colony_028.jpg ... от (1101251 bytes) до (1101251 bytes) ... Сжатие файлов/1013/0269/0299/Exclusive_Duplex_Penthouse_in_the_German_Colony_0171.jpg ... из (20912 байт) до (20912 байт) ... сжимающих файлов/1013/0821/0299/Beautiful_views_to_the_Knesset_and_Gan_Saker_016.JPG ... из (570428 байт) до (570428 байт) ... сжимающих файлов/1013/0822/0660/Beautiful_new_penthouse_in_luxurious_building_with_pool_158double.jpg ... из (1020561 байт) до (1020561 байт) ... сжимающих файлов/1013/0847/8190/New_luxurious_penthouse_with_private_entrance_in_Old_Katamon_016.JPG ... из (542071 байт) до (542071 байт) ... ... ... ...

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

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

+2

Попробуйте выполнить 'clearstatcache() 'между двумя вызовами с файлами –

+0

В Иерусалиме есть немецкая колония? Интересно. (ах, а с 19-го века не меньше!) Там идет мой перерыв на обед, читая Википедию. Мальчик, я бы хотел владеть этим таунхаусом. Или пентхаус! * drool *) –

+0

Спасибо большое! Это сделал трюк! – Meir

ответ

1

filesize() использует механизм кэширования («кеш-файл»), который может не иметь достаточно времени для обновления между двумя вызовами.

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

1

Функция filesize() кэширует размер для каждого файла, чтобы предотвратить stat() - syscalls, которые довольно медленны. Он внутренне сохраняет файлы для заданного имени файла, чтобы быстрее реагировать на новые вызовы.

Как и было предложено, вы должны вызвать 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>'; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^