Прошу откликнуться знатоков.
Есть большущий объем тумбов (преъевью картинок) на сервере, порядка 500Гб.
Сейчас размер их не устраивает. Написал скрипт который обходит папки и работает с картинками из папок thumbs.
Сам скрипт работает нормально.
Прошу дать советы как не повесить моим скриптом сервер.
Использую в данный момент sleep, но может лучше повесить на крон?
Так же рад любой помощи в оптимизации кода, да бы ускорить процесс обработки тумбов.
Собственно сам код (всего 74 строки)
$start_dir = "F:/www/site.ru/htdocs/upload/photos/posts/"; //полный путь к корневой папке с фоткамми
$w_th = 200; //новая длина тумбы
$h_th = 150; //новая высота тумбы
$cnt_sleep = 10; //после какого числа элементов делать задержку
$time_sleep = 10; //на сколько делать задержку
/*********************************************************/
$ratio = $w_th / $h_th; //определяем коэффициент сжатия изображения
$total = 0; //кол-во обработанных тумбов
$none = 0; //кол-во не обработанных тумбов
class ImageFilter extends FilterIterator {
public function accept () {
return preg_match('@\.(gif|jpe?g|png)$@i', $this->current());
}
}
$dir = (new RecursiveDirectoryIterator($start_dir));
foreach (new ImageFilter(new RecursiveIteratorIterator($dir)) as $file) {
if($total == $cnt_sleep) sleep($time_sleep);
if(preg_match("/thumbs/i", $file->getPath())) {
$result = Resizefile($file->getPathname());
if($result) $total++;
else $none++;
}
}
function Resizefile($file_path) {
global $ratio, $w_th, $h_th;
list($width, $height, $mime) = getimagesize($file_path);
if(($width <= $w_th) && ($height <= $h_th))
return false;
$src_ratio = $width / $height;
if($ratio < $src_ratio) $h_th = $w_th/$src_ratio;
else $w_th = $h_th*$src_ratio;
$clear_img = imagecreatetruecolor($w_th, $h_th);
if($mime == 1)
$src_img = imagecreatefromgif($file_path);
elseif($mime == 2)
$src_img = imagecreatefromjpeg($file_path);
elseif($mime == 3)
$src_img = imagecreatefrompng($file_path);
else
return false;
imagecopyresampled($clear_img, $src_img, 0, 0, 0, 0, $w_th, $h_th, $width, $height);
unlink($file_path);
if($mime == 1)
imagegif($clear_img, $file_path);
elseif($mime == 2)
imagejpeg($clear_img, $file_path);
elseif($mime == 3)
imagepng($clear_img, $file_path);
imagedestroy($clear_img);
imagedestroy($src_img);
return true;
}
echo "Кол-во обработанных тумбов : {$total}, не обработанных {$none}";
Спустя 1 минута, 49 секунд (10.08.2010 - 17:37) REZzANATOR написал(а):
фак.. забыл войти
Это мой пост)))
Это мой пост)))
Спустя 3 часа, 27 минут, 14 секунд (10.08.2010 - 21:04) linker написал(а):
foreach (new ImageFilter(new RecursiveIteratorIterator($dir)) as $file) {}Эта жесть... если у меня в папке 10 тысяч файлов, то в цикле получим 10 тысяч объектов создаваемых в цикле, плюс еще, а если есть подпапки - ващее можно афигеть.
Спустя 4 минуты, 4 секунды (10.08.2010 - 21:08) linker написал(а):
P.S. Вот это условие
if($total == $cnt_sleep) sleep($time_sleep);выполнится только один раз за все время работы скрипта, когда $total примет значение "10".
Спустя 1 минута, 24 секунды (10.08.2010 - 21:09) REZzANATOR написал(а):
а варианты? по другому по моему ни как.
Эээ.. со слипом тупанул) спасибо..подправим
Эээ.. со слипом тупанул) спасибо..подправим
Спустя 3 минуты, 42 секунды (10.08.2010 - 21:13) linker написал(а):
Не знаю, как остальные, но я бы прошелся рекурсивным перебором папок, без всяких классов. Имхо, это было бы гораздо быстрее и менее требовательно к ресурсам сервака.
Спустя 17 часов, 17 минут, 56 секунд (11.08.2010 - 14:31) REZzANATOR написал(а):
хм. ты прав
на рекурсии 10000 файлов - Скрипт отработал за 141.309851 секунд
на итераторе 10000 файлов - Скрипт отработал за 151.990946 секунд
как бы узнать повешу ли я своим скриптом сервак
на моем компе =) четырех ядерка - ни капли подвисалок + set_timelimit (0)
на рекурсии 10000 файлов - Скрипт отработал за 141.309851 секунд
на итераторе 10000 файлов - Скрипт отработал за 151.990946 секунд
как бы узнать повешу ли я своим скриптом сервак
на моем компе =) четырех ядерка - ни капли подвисалок + set_timelimit (0)
Спустя 7 минут, 47 секунд (11.08.2010 - 14:39) linker написал(а):
Я думаю ничего не случится с твоим серваком. А зачем тебе cron?
Спустя 2 часа, 13 минут, 19 секунд (11.08.2010 - 16:52) REZzANATOR написал(а):
объем тумбов не маленький. думал вешать на cron и запускать ночью скрипт с какой нить переодичностью
Спустя 3 часа, 19 минут, 5 секунд (11.08.2010 - 20:11) linker написал(а):
REZzANATOR
А не пробовал, один раз пережать, а потом переделать скрипт, который эти тумбы генерит?
А не пробовал, один раз пережать, а потом переделать скрипт, который эти тумбы генерит?
Спустя 2 часа, 59 минут, 9 секунд (11.08.2010 - 23:10) REZzANATOR написал(а):
так и хочу сделать=) только на данный момент оч много их скопилось