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(тут на тостере обсуждалось уже, была ветка похожая).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
16 апр. 2024, в 10:47
80000 руб./за проект
16 апр. 2024, в 10:41
1000 руб./за проект
16 апр. 2024, в 10:39
2000 руб./за проект