alexandrknyazev13071995
@alexandrknyazev13071995

Как изменить скрипт сжатия изображений, чтобы он позволял загружать большое количество изображений?

Добавил на сайт скрипт с урока на сайте ruseller.com/lessons.php?rub=37&id=953 позволяющий создавать миниатюры изображений:
<?php
$thumb_directory =  "../photos/2_10_2015/mini/";    	//Папка для миниатюр 
$orig_directory = "../photos/2_10_2015/full/";    	//Папка для полноразмерных изображений 
 
$dir_handle = @opendir($orig_directory); 	//Открываем папку с полноразмерными изображениями 
if ($dir_handle > 1){ 				//Проверяем, что папка открыта и в ней есть файлы
 
    $allowed_types=array('jpg','jpeg','gif','png'); // Список обрабатываемых расширений
    $file_parts=array();
    $ext='';
    $title='';
    $i=0;
     
    while ($file = @readdir($dir_handle))
    {
        /* Пропускаем системные файлы: */
        if($file=='.' || $file == '..') continue;
     
        $file_parts = explode('.',$file);    	//Разделяем имя файла на части 
        $ext = strtolower(array_pop($file_parts));
     
        /* Используем имя файла (без расширения) как заголовок изображения: */
        $title = implode('.',$file_parts);
        $title = htmlspecialchars($title);
     
        /* Если расширение входит в список обрабатываемых: */
        if(in_array($ext,$allowed_types))
        {
     
            /* Если вы планируете хранить изображения в базе данных, вставьте код для запроса здесь */
     
            /* Далее следует код, который разбирался в уроке */
            /* Выводим каждое изображение: */
     
            $nw = 250;
            $nh = 170;
            $source = $orig_directory . $file;
            $stype = explode(".", $source);
            $stype = $stype[count($stype)-1];
            $dest = $thumb_directory . $file;
     
            $size = getimagesize($source);
            $w = $size[0];
            $h = $size[1];
     
            switch($stype) {
                case 'gif':
                    $simg = imagecreatefromgif($source);
                    break;
                case 'jpg':
                    $simg = imagecreatefromjpeg($source);
                    break;
                case 'png':
                    $simg = imagecreatefrompng($source);
                    break;
            }
     
            $dimg = imagecreatetruecolor($nw, $nh);
            $wm = $w/$nw;
            $hm = $h/$nh;
            $h_height = $nh/2;
            $w_height = $nw/2;
     
            if($w> $h) {
                $adjusted_width = $w / $hm;
                $half_width = $adjusted_width / 2;
                $int_width = $half_width - $w_height;
                imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
            } elseif(($w <$h) || ($w == $h)) {
                $adjusted_height = $h / $wm;
                $half_height = $adjusted_height / 2;
                $int_height = $half_height - $h_height;
     
                imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
            } else {
                imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
            }
                imagejpeg($dimg,$dest,100);
            }
}
 
/* Закрываем папку */
@closedir($dir_handle);
 
}
?>

При попытке загрузить сразу 100 изображений сервер отвалился с ошибкой Fatal error: Maximum execution time of 30 seconds exceeded
Какие посоветуете способы решения проблемы?
  • Вопрос задан
  • 834 просмотра
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
А в чем проблема? У вас есть скрипт, он работает, но 100 фоток сразу он не может обработать, скорости работы не хватает чтобы уложиться в 30 секунд. Либо заливайте меньшими порциями, либо увеличьте max_execution_time, собсно это 2 наиболее очевидных пути. Есть еще варианты вынести отдельно работу с загрузкой и работу с ресайзом, или вынести обработку и кэширование превью на nginx(тут на тостере обсуждалось уже, была ветка похожая).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы