PHP автоматическое изменение размера (autoresize) картинки (image)

Дорогие друзья, зачастую, чтобы опубликовать картинку на сайте, нам приходится изменять её размеры и создавать дополнительную миниатюру. Таким образом, мы экономим трафик и гармонично внедряем картинку в дизайн сайта. Если же подключить библиотеку спецэффектов, тот же fancybox, так вообще получается красота.

PHP автоматическое изменение размера (autoresize) картинки (image)

Проблема заключается в том, что изменение размера картинки и создание миниатюр это дело, которое требует от нас дополнительных средств и усилий. Как человек ленивый, решил упростить задачу и позаимствовав идею у Google сервиса Picasa Web Albums, создать php-скрипт, который бы выполнял всю необходимую работу по автоматическому изменению размера (autoresize) картинки (image).

Установка и настройка php-скрипта для автоматического изменения размера картинки

Шаг 1: установка. скачайте архив thumb.zip. Распакуйте и скопируйте файл thumb.php в корневую папку сайта. В архиве уже есть все нужные папки, картинка-пример и .htaccess файл, но дальше я распишу более подробно для индивидуальных ситуаций.

Скачать бесплатно!

Шаг 2: настройка. Откройте файл thumb.php в текстовом редакторе (например, «Блокнот» из «Стандартные») и укажите свои параметры.

  • $path_images – относительный или полный путь к папке, в которой хранятся полноразмерные (большие) картинки (обязательно с символом слеш (/) в конце!);
  • $path_thumbs – относительный или полный путь к папке, в которой будут храниться миниатюры (обязательно с символом слеш (/) в конце!);
  • $size_min – минимальный размер миниатюры в пикселях, не зависимо от указанного значения в переменной s переданной php-скрипту (по умолчанию = 1);
  • $size_def – размер миниатюры по умолчанию, если php-скрипту не передан переменная s, в пикселях (по умолчанию = 150);
  • $size_max – максимальный размер миниатюры в пикселях, не зависимо от указанного значения в переменной s переданной php-скрипту (по умолчанию = 1600);
  • $size_cached – массив кэшируемых размеров картинок в пикселях (по умолчанию только 150), остальные будут создаваться без кэширования;
  • $cache_lifetime – время актуальности кэша миниатюры в секундах (по умолчанию = 84000).

Шаг 3: ЧПУ для миниатюр. Откройте файл .htaccess из корневой папки сайта в текстовом редакторе (например, «Блокнот» из «Стандартные»). Если файл .htaccess отсутствует – убедитесь, что ваш хостинг провайдер поддерживает эту возможность, в частности mod_rewrite. Найдите в нём строки, начинающиеся с RewriteRule, например:

RewriteRule ^([a-z0-9-_]{1,40}).html$ index.php?furl=$1 [L,QSA]

Если такие строки есть, вставьте перед ними следующие строки:

RewriteRule ^thumb/([a-z0-9-_.]{1,30})$ thumb.php?f=$1 [L,QSA]
RewriteRule ^thumb/([0-9]{1,11})/([a-z0-9-_.]{1,30})$ thumb.php?f=$2&s=$1 [L,QSA]

Если таких строк нет, добавьте в конец файла следующие строки:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^thumb/([a-z0-9-_.]{1,30})$ thumb.php?f=$1 [L,QSA]
RewriteRule ^thumb/([0-9]{1,11})/([a-z0-9-_.]{1,30})$ thumb.php?f=$2&s=$1 [L,QSA]
</IfModule>

Таким образом, у ваших миниатюр будет простой и удобный URL-адрес.

Шаг 4: запрет индексации миниатюр. Откройте файл robots.txt из корневой папки сайта в текстовом редакторе (например, «Блокнот» из «Стандартные»). Если файл robots.txt отсутствует – создайте его. Найдите в нем строки, начинаю с Disallow, например:

User-agent: *
Disallow: /cgi-bin

Если такие строки есть, добавьте к ним следующую строку:

Dissallow: /thumb
Dissallow: /thumb.php

Ели таких строк нет, добавьте следующие строки

User-agent: *
Dissallow: /thumb
Dissallow: /thumb.php

Таким образом, мы запретим индексацию миниатюр и избежим дублей. Главное чтобы индексировались полноразмерные картинки.

Использование php-скрипта для автоматического изменения размера картинки

Если ваш хостинг-провайдер не поддерживает mod_rewrite или вы не хотите использовать ЧПУ для миниатюр, вы всегда можете обращаться к php-скрипту напрямую. Общий формат URL-строки такого вызова будет иметь вид:

http://sitename.ru/thumb.php?f={filename}[&s={size}]

где значением переменной f является имя файла картинки в папке с полноразмерными картинками ($path_images), а значением не обязательной переменной s – максимальный размер миниатюры (если переменная не указана, используется значение из $size_def).

Пример: http://sitename.ru/thumb.php?f=image.jpg&s=200

Примечательно, что кэшироваться будут только те миниатюры, чей размер прописан в массиве $size_caches. Кэширование позволяет в значительной степени уменьшить нагрузку на сервер и увеличить скорость обработки запроса.

Если же вы используете ЧПУ для миниатюр, то общий формат URL-строки будет иметь следующий вид:

http;//sitename.ru/thumb/[{size}/]{filename}

Пример: http://sitename/thumb/200/image.jpg

Опять же, вы можете не указывать {size}. В таком случае будет использоваться значение из $size_def.

Пример: http://sitename/thumb/image.jpg

Если у вас есть вопросы, предложения и т.д. – пишите, будем разбираться. На этом у меня всё. Спасибо за внимание. Удачи!

Twitter Facebook ВКонтакте Одноклассники Google+

16 комментариев:

Рустам Атабаев
Здравствуйте, Константин! Не могу настроить ваш скрипт(. Сделал все по инструкции, но ничего не происходит. Для проверки ко всем командам exit добавил ("error"). В результате не проходит даже первое условие вашего скрипта:
if ( isset($_GET['f']) ) $f = (string) $_GET['f']; else exit;
Как он может получать что-то из массива $_GET если мы через него ничего не передаём? Иерархию папок не менял, создал как у вас.
Константин Кирилюк
2Рустам Атабаев а Вы файл .htaccess настроили?
Рустам Атабаев
Пробовал на локальном сервере. Т.к. на локальном сервере его нет, то я его создал добавив последний код:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^thumb/([a-z0-9-_]{1,30})$ thumb.php?f=$1 [L,QSA]
RewriteRule ^thumb/([0-9]{1,11})/([a-z0-9-_.]{1,30})$ thumb.php?f=$2&s=$1 [L,QSA]


Пробовал на хостинге добавив этот же код в конце файла htaccess.
Результат одинаковый - Я запускаю скрипт по пути site/thumb.php, происходит подгрузка и все папка thumbs остаётся пустой(
Константин Кирилюк
2Рустам Атабаев Всё зависит от того, а есть ли у Вас на сервере поддержка модуля преобразования адресов. Впрочем, наверное:

&lg;IfModule mod_rewrite.c>
...
&lg;/IfModule>

пропало из комментария из-за того, что Вы использовали знаки &lg; и > вместо мнемоник &lg; и &gt; соответственно.

Давайте думать дальше. Первое, что приходит в голо - нарушение файловой структуры и/или отсутствие каких-то файлов/папок. По умолчанию всё должно быть так:

.htaccess
thumb.php
images/photos/
images/photos/images.jpg (тестовая картинка)
images/photos/thumbs/

Они все должны существовать. В архив я .htacces и пустые папки не добавлял. Скрипт их не создаёт. Так что убедитесь что с этим всё нормально. Для этого в скрипте thumb.php перед строкой:

/* дальше ничего не менять */

вставьте следующий код:

if ( file_exists($path_images) ) die('Images Dir: '. $path_images .' - not exists.');
if ( file_exists($path_thumbs) ) die('Thumbs Dir: '. $path_thumbs .' - not exists.');

Посмотрим, что скажет.

Пы.Сы. можно попробовать обратиться к скрипту без преобразования URL-адреса, например (с учётом указанной ранее тестовой картинки):

thumb.php?f=images.jpg
Рустам Атабаев
Насчёт состава файлов, ошибки быть не должно, но чтобы убедиться я заскринил все пути и код в .htaccess, если не сложно, то посмотрите:
https://drive.google.com/file/d/0B0Lp8ZNIToRaQXM4VjlCWjd2Rzg/view

Ваш код для проверки существования пути я добавил. Ошибки не появились. Однако первое условие всё так же не выполняется(Имею в виду условие с массивом $_GET).

При попытке обращения через адресную строку thumb.php?f=images.jpg. Ошибка с массивом исчезает, но к сожаление ничего не происходит(

Я уже, почти, уверен, что это дело в файле .htaccess, но на хостинге у меня стоит ЧПУ и он работает...
Константин Кирилюк
2Рустам Атабаев я вам дал неправильный код, правильный этот:

if ( !file_exists($path_images) ) die('Images Dir: '. $path_images .' - not exists.');
if ( !file_exists($path_thumbs) ) die('Thumbs Dir: '. $path_thumbs .' - not exists.');

Нужно добавить восклицательные знаки (!). Только в этом случае условия будут правильными: если директория не существует - выводим ошибку.
Рустам Атабаев
Я поменял код. Выкинуло ошибку, что путь не существует. У меня стоял абсолютный путь:
$path_images = '/images/photos/'; /* папка с картинками */
$path_thumbs = '/images/photos/thumbs/'; /* папка с миниатюрами */

Я изменил его на относительный, убрав первый слэш:
$path_images = 'images/photos/'; /* папка с картинками */
$path_thumbs = 'images/photos/thumbs/'; /* папка с миниатюрами */

Ошибка пропала, но результат работы не изменился: ошибка при получении через массив $_GET.
Константин Кирилюк
2Рустам Атабаев абсолютный путь подразумевает полный адрес а не только слэш (/), ну да ладно... изначально в скрипте был именно относительный путь... с ним проще.

Теперь давайте разбираться, что с массивом $_GET. Для этого перед строкой:

if ( isset($_GET['f']) ) $f = (string) $_GET['f']; else exit;

вставьте такой код:

echo '<pre><b>$_GET</b>'."\n";
var_dump($_GET);
echo "\n".'<b>$_GET</b>'."\n";
var_dump($HTTP_GET_VARS);
die('</pre>');

Здесь я, на всякий случай, добавил проверку и устаревшей переменной $HTTP_GET_VARS, возможно у Вас старый PHP на локали или сервере.
Рустам Атабаев
После манипуляций с путями заработало прямое обращение к скрипту:
thumb.php?f=images.jpg.

Добавил ваш код перед строкой с массивом. В результате в браузере появилось несколько строк с пустыми массивами:
$_GET
array(0) {
}

$_GET
array(0) {
}
Константин Кирилюк
2Рустам Атабаев ага, значит всё дело в .htaccess. Здесь 3 варианта:

1. Не поддерживается mod_rewrite т.к. сервер работает не на Apache
2. Не поддерживается mod_rewrite т.к. модуль не включён в сборку или запрещена настройка через .htaccess

В этих двух случаях, можно провести простую проверку, см. тут. Если поддержки .htaccess нет, то придётся довольствоваться прямым обращением к скрипту.

3. В .htaccess уже есть другие правила преобразования, см. по наличию директив RewriteRule. Тогда надо в конец к ним добавить только два основных правила:

RewriteRule ^thumb/([a-z0-9-_]{1,30})$ thumb.php?f=$1 [L,QSA]
RewriteRule ^thumb/([0-9]{1,11})/([a-z0-9-_.]{1,30})$ thumb.php?f=$2&s=$1 [L,QSA]

4. Не поддерживается директива проверки наличия модуля. Здесь попробуй убрать строки:

<IfModule mod_rewrite.c>

и

</IfModule>

По сути, их наличие не играет существенного значения. Вполне возможно просто используется другая версия модуля и правило не проходит.
Рустам Атабаев
1. Как я говорил ранее mod_rewrite у меня работает т.к. работает ЧПУ. Для проверки перешёл по вашей ссылке и, как ожидалось, ответ - mod_rewrite works!

2. На локальном сервере в .htaccess только ваш код. На хостинге добавил пару строк вниз. Но нигде нет эффекта.

Константин, вы можете выложить демо версию скрипта к этой новости? Мне кажется это убрало бы кучу вопросов. И пользователи могли бы сами разобраться не напрягая вас.
Константин Кирилюк
2Рустам Атабаев demo-версия ничего не даст, т.к. ты сможешь увидеть только результат. С путями ми разобрали. И я, похоже, нашел ошибку в .htacces. Дело вот в этой строке:

RewriteRule ^thumb/([a-z0-9-_]{1,30})$ thumb.php?f=$1 [L,QSA]

Здесь в регулярном выражении, в наборе допустимых символов промущен символ точки, должно быть так:

RewriteRule ^thumb/([a-z0-9-_.]{1,30})$ thumb.php?f=$1 [L,QSA]

и ещё, не стоит забывать о допустимых размерах в массиве $size_cached. По умолчанию доступен только 150 - небольшая защита.
Рустам Атабаев
Немного не так выразился не демо версию. А архив с файлами и папками и, хотябы 2-мя картинками, что бы пользователь мог разархировать их у себя на сервер и запустить. В результате чего, если скрипт рабочий, исключить кучу вопросов.

Строки заменил, но, к сожалению, результат остался прежним.
Константин Кирилюк
2Рустам Атабаев Вот, немного подновил. С папками, картинкаими и .htaccess: https://yadi.sk/d/n2PZJ8skdf2vh
Рустам Атабаев
Попробовал и на локалке и на своём хостинге и на хостинге друга результат:
The File Name is not specified

Причём при прямом обращении превьюшка создаётся и выводится мгновенно.

Ладно, благодарю за помощь! Буду искать другое решение
Константин Кирилюк
2Рустам Атабаев значит ответ однозначный - проблема с .htacces Следует уточнить, что файл thumb.php должен быть в той же директории что и файл .htacces из примера. Просто из интереса скинул на сервер sweb: http://c3h.ru/thumb/image.jpg - у меня всё работает. Обращайтесь к хостинг провайдеру.
Отправить комментарий