PHP автоматическое изменение размера (autoresize) картинки (image)
Дорогие друзья, зачастую, чтобы опубликовать картинку на сайте, нам приходится изменять её размеры и создавать дополнительную миниатюру. Таким образом, мы экономим трафик и гармонично внедряем картинку в дизайн сайта. Если же подключить библиотеку спецэффектов, тот же fancybox, так вообще получается красота.
Проблема заключается в том, что изменение размера картинки и создание миниатюр это дело, которое требует от нас дополнительных средств и усилий. Как человек ленивый, решил упростить задачу и позаимствовав идею у 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
Если у вас есть вопросы, предложения и т.д. – пишите, будем разбираться. На этом у меня всё. Спасибо за внимание. Удачи!
16 комментариев:
if ( isset($_GET['f']) ) $f = (string) $_GET['f']; else exit;
Как он может получать что-то из массива $_GET если мы через него ничего не передаём? Иерархию папок не менял, создал как у вас.
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 остаётся пустой(
≶IfModule mod_rewrite.c>
...
≶/IfModule>
пропало из комментария из-за того, что Вы использовали знаки ≶ и > вместо мнемоник ≶ и > соответственно.
Давайте думать дальше. Первое, что приходит в голо - нарушение файловой структуры и/или отсутствие каких-то файлов/папок. По умолчанию всё должно быть так:
.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
https://drive.google.com/file/d/0B0Lp8ZNIToRaQXM4VjlCWjd2Rzg/view
Ваш код для проверки существования пути я добавил. Ошибки не появились. Однако первое условие всё так же не выполняется(Имею в виду условие с массивом $_GET).
При попытке обращения через адресную строку thumb.php?f=images.jpg. Ошибка с массивом исчезает, но к сожаление ничего не происходит(
Я уже, почти, уверен, что это дело в файле .htaccess, но на хостинге у меня стоит ЧПУ и он работает...
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.
Теперь давайте разбираться, что с массивом $_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) {
}
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>
По сути, их наличие не играет существенного значения. Вполне возможно просто используется другая версия модуля и правило не проходит.
2. На локальном сервере в .htaccess только ваш код. На хостинге добавил пару строк вниз. Но нигде нет эффекта.
Константин, вы можете выложить демо версию скрипта к этой новости? Мне кажется это убрало бы кучу вопросов. И пользователи могли бы сами разобраться не напрягая вас.
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 - небольшая защита.
Строки заменил, но, к сожалению, результат остался прежним.
The File Name is not specified
Причём при прямом обращении превьюшка создаётся и выводится мгновенно.
Ладно, благодарю за помощь! Буду искать другое решение
Отправить комментарий