Создание миниатюр по мере необходимости (thumb_*)

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
ZhAN
phpBB 1.2.1
Сообщения: 25
Зарегистрирован: 11.07.2008 16:07
Откуда: Киев
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Создание миниатюр по мере необходимости (thumb_*)

Сообщение ZhAN » 19.07.2008 21:25

Мод: thumbnails on demand

Возникла собственно проблема после конвертации - отстутствие уменьшенных изображений.
Судя по коду ПХПбб3 он формирует уменьшенное изображение лишь по время его добавления/сохранения.
Возникло желание уговорить phpBB формировать уменьшенное изображение в случае его отсутствия на лету.

После этой модификации когда phpBB пытается показать уменьшенную картинку и ее нету - происходит попытка ее создать заново.
Как вариант использования этого мода - после изменения в админке "Сообщения - настройки вложений - Максимальная ширина миниатюр" достаточно просто удалить файлы thumb_* из папки files. Они будут созданы с новыми параметрами по мере просмотра их пользователями форума.

Код: Выделить всё

#-----[ OPEN ]-----
download/file.php

#-----[ FIND ]-----
	if (!@file_exists($filename)) 
		{
			trigger_error($user->lang['ERROR_NO_ATTACHMENT'] . '<br /><br />' . sprintf($user->lang['FILE_NOT_FOUND_404'], $filename));

#-----[ BEFORE, ADD ]-----
	if (!@file_exists($filename) && substr($attachment[physical_filename],0,6) == 'thumb_')
	{
		$image_file = substr($attachment[physical_filename],6);
		include_once("../includes/functions_posting.php");
		if (! create_thumbnail($phpbb_root_path . $upload_dir . '/' . $image_file, $filename, '')) 
		{ // disable thumbnail 
			$db->sql_query('UPDATE ' . ATTACHMENTS_TABLE . ' SET thumbnail = 0 WHERE attach_id = ' . $attachment['attach_id']);
		};
	};
#-----[ SAVE/CLOSE ALL FILES ]-----
Итак чтобы пересоздать миниатюры (скажем после изменения максимальной ширины) нужно:
1. убрать старые миниатюры files/thumb_*
2. выставить флаг использования миниатюр для всех графических файлов:

Код: Выделить всё

UPDATE phpbb_attachments SET thumbnail = 1 WHERE extension IN ('jpg','jpeg','gif','png','tiff')
или если правильно заполнено mimetype

Код: Выделить всё

UPDATE phpbb_attachments SET thumbnail = 1 WHERE mimetype LIKE 'image/%'

Добавлено спустя 7 минут 18 секунд:
Также я обратил внимание на откровенно плохое качество масштабирования миниатюр (я использую imagick). Как решение предлагаю следующее:

Код: Выделить всё

#-----[ OPEN ]-----
includes/functions_posting.php

#-----[ FIND ]-----
		@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample  ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');

#-----[ REPLACE ]-----
		@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -resize ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');

#-----[ SAVE/CLOSE ALL FILES ]-----
Короче вместо -sample использовать -resize. Да это намного более ресурсоемкая процедура.. но она выполняется лишь единожды при создании миниатюры.
Последний раз редактировалось ZhAN 10.02.2009 10:22, всего редактировалось 5 раз.

Аватара пользователя
FladeX
Former team member
Сообщения: 1935
Зарегистрирован: 02.06.2007 23:44
Откуда: Саранск
Благодарил (а): 7 раз
Поблагодарили: 59 раз

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение FladeX » 19.07.2008 21:37

Спасибо большое!
Во время конвертации не получилось обработать аттачи, поэтому миниатюр не создалось. Надеюсь, данный мод решит проблему.
//
// Okay, let's do the loop, yeah come on baby let's do the loop
// and it goes like this ...
| phpBB Adept ] | Каталог форумов | генератор sitemap для форумов | форум про форумы

Аватара пользователя
ZhAN
phpBB 1.2.1
Сообщения: 25
Зарегистрирован: 11.07.2008 16:07
Откуда: Киев
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение ZhAN » 19.07.2008 22:36

Вижу потенциальную проблему. Думаю как решить.
Изменение в админке "Максимальная ширина миниатюр" никак не влияет на то какие из существующих аттачей будет показаны как миниатюры а какие без уменьшения. Из этого следуют следующие проблемы:

Возможна ситуация когда картинка шириной скажем 400 пикселей была загружена в момент когда макс ширина была 480 (соответственно эта картинка при загрузке отметилась как "без миниаютры"). Если в админке теперь уменьшить "Максимальная ширина миниатюр" - миниатюра для этого файла всеравно не создастся (так как в базе стоит флаг нет миниатюры).

Возможна и обратная ситуация (намного худшая), когда картинка размером скажем шириной 300px была загружена во время действия "макс ширина" - 400 и была создана миниатюра (и выставлен соответствующий флаг в базе), теперь если уменьшить "макс ширину" скажем до 200, и удалить thumb_ для пересоздания.. - картинка вообще не будет показываться.. так как phpBB пытается показывать ее через миниатюру.. а миниатюра не создается так как размеры картинки меньше размеров миниатюры.

Добавлено спустя 54 минуты 7 секунд:
ZhAN писал(а):Вижу потенциальную проблему.
Код

Код: Выделить всё

create_thumbnail($phpbb_root_path . $upload_dir . '/' . $image_file, $filename, ''))
заменил на

Код: Выделить всё

if (! create_thumbnail($phpbb_root_path . $upload_dir . '/' . $image_file, $filename, '')) 
{ // if fail disable thumbnail 
	$db->sql_query('UPDATE ' . ATTACHMENTS_TABLE . ' SET thumbnail = 0 WHERE attach_id = ' . $attachment['attach_id']);
};
В первом сообщении тоже внес эти изменения.
Если создание миниатюры не получилось - снимается соответствующий флаг и при следующем показе каринка будет показана оригинальным размером.

Т.е. теперь смело можно включать thumbnail = 1 для всех графических файлов, в случае проблемы создания миниатюры - флаг автоматом снимается.

Thanx
phpBB 2.0.2
Сообщения: 334
Зарегистрирован: 27.12.2005 17:37
Благодарил (а): 16 раз

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение Thanx » 08.12.2008 16:39

Отличный мод. Большое спасибо. Во-первых, понял, почему у меня на одном форуме миниатюры не показывались (флаг был, а самих миниатюр не было), во-вторых, везде настроил миниатюры именно так, как я хочу. :) Спасибо за мод и объяснение его работы.

Теперь, при необходимости, и параметры понятно как менять: стёр все thumb вложения в папке files, установил новые ограничения, и всё готово.

Аватара пользователя
Dmitrij
phpBB 1.4.2
Сообщения: 72
Зарегистрирован: 18.06.2004 20:06
Откуда: Москва
Поблагодарили: 4 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение Dmitrij » 10.01.2009 23:13

FladeX писал(а):Во время конвертации не получилось обработать аттачи, поэтому миниатюр не создалось. Надеюсь, данный мод решит проблему.
То же самое.
Поставил мод но после установки пропали Аваторы и картинки
Хотелось бы понять, что не так.
Вложения
vstavka.JPG
С уважением, Дмитрий.

Аватара пользователя
ZhAN
phpBB 1.2.1
Сообщения: 25
Зарегистрирован: 11.07.2008 16:07
Откуда: Киев
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение ZhAN » 13.01.2009 12:14

Dmitrij, из твоего объяснения ничего не понятно.
С одной стороны ты говоришь у тебя "тоже самое" (после конвертации нету атачей), с другой - описываешь совсем другую проблему (якобы пропали атачи после установки мода).

Т.е. до установки аттачи и аватары у тебя работали, а после перестали?
Хочешь чтобы тебе помогли, потрудись описать подробно свою проблему..

Аватара пользователя
Dmitrij
phpBB 1.4.2
Сообщения: 72
Зарегистрирован: 18.06.2004 20:06
Откуда: Москва
Поблагодарили: 4 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение Dmitrij » 13.01.2009 20:24

Хорошо, сейчас поправлюсь.
При переезде phpBB2 на phpBB3 у меня перенеслись аттачи, но по чему то не создались миниатюры, то есть файлы открываются большие во весь экран, Решил поставить ваш мод, что создать новые миниатюры. Но после установки мода получилась вот такая картинка.
С уважением, Дмитрий.

Аватара пользователя
ZhAN
phpBB 1.2.1
Сообщения: 25
Зарегистрирован: 11.07.2008 16:07
Откуда: Киев
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение ZhAN » 16.01.2009 16:35

Dmitrij
а вообще в новых сообщениях как работают аттачи?

А если обновить страницу ничего не меняется? (при второй загрузке миниатюры отключаются и "ошибок" быть не должно)
Попробуй скопировать ссылку на картинку и открыть ее в отдельном окне.

Вобщем слишком мало данных чтобы заочно ставить диагноз..

Аватара пользователя
Andrew O
phpBB 1.4.2
Сообщения: 53
Зарегистрирован: 21.04.2008 17:43
Откуда: с родины А.И. Родимцева
Благодарил (а): 2 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение Andrew O » 27.10.2009 9:42

Thanx писал(а):Отличный мод. Спасибо за мод и объяснение его работы.Теперь, при необходимости, и параметры понятно как менять: стёр все thumb вложения в папке files, установил новые ограничения, и всё готово.
+1 присоединяюсь к выше сказанному, всё работает как надо ;)

_scorpio_
phpBB 1.0.0
Сообщения: 3
Зарегистрирован: 16.05.2009 5:22
Благодарил (а): 2 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение _scorpio_ » 02.05.2012 18:35

решил свою проблему с медленной загрузкой изображений =)
суть мода та что и у вас, только усовершенствовано для nginx и со временем меньше работает с download/file.php (задача была отдавать статику nginx-ом)
может я и не прав, но пока работает...

Код: Выделить всё

#-----[ OPEN ]-----
download/file.php

#-----[ FIND ]-----
	if (!@file_exists($filename)) 
		{
			trigger_error($user->lang['ERROR_NO_ATTACHMENT'] . '<br /><br />' . sprintf($user->lang['FILE_NOT_FOUND_404'], $filename));

#-----[ BEFORE, ADD ]-----
	// physical filename attachment and thumbs mod by _scorpio_ v1.0
	if (!@file_exists($filename) && substr($attachment[physical_filename],0,6) == 'thumb_')
	{
		$image_file = substr($attachment[physical_filename],6);
		include_once("../includes/functions_posting.php");
		if (! create_thumbnail($phpbb_root_path . $upload_dir . '/' . $image_file, $filename, '')) 
		{ // disable thumbnail 
			$db->sql_query('UPDATE ' . ATTACHMENTS_TABLE . ' SET thumbnail = 0 WHERE attach_id = ' . $attachment['attach_id']);
		};
	};
	// physical filename attachment and thumbs mod by _scorpio_ v1.0
	
#-----[ OPEN ]-----
includes/functions_content.php

#-----[ FIND ]-----
		// Some basics...
		$attachment['extension'] = strtolower(trim($attachment['extension']));
		$filename = $phpbb_root_path . $config['upload_path'] . '/' . utf8_basename($attachment['physical_filename']);
		$thumbnail_filename = $phpbb_root_path . $config['upload_path'] . '/thumb_' . utf8_basename($attachment['physical_filename']);

#-----[ AFTER, ADD ]-----
		// physical filename attachment and thumbs mod by _scorpio_ v1.0
		global $db;
		if (strpos($attachment['physical_filename'], '.') === false) {
			if (@rename($filename, $filename.'.'.$attachment['extension'])) {
				$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
				SET physical_filename = "'.$attachment['physical_filename'].'.'.$attachment['extension'].'" 
				WHERE attach_id = '. $attachment['attach_id'];
				$db->sql_query($sql);
				$filename .= '.'.$attachment['extension'];
			}
			if ($attachment['thumbnail']) {
				if (@rename($thumbnail_filename, $thumbnail_filename.'.'.$attachment['extension'])) {
					$thumbnail_filename .= '.'.$attachment['extension'];
				}
			}
		}
		// physical filename attachment and thumbs mod by _scorpio_ v1.0

#-----[ FIND ]-----
$inline_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']);

#-----[ REPLACE ]-----
					// $inline_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']);
					// physical filename attachment and thumbs mod by _scorpio_ v1.0
					if (strpos($filename, '.') === false) {
						$inline_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']);
					} else {
						$inline_link = $filename;
					}
					// physical filename attachment and thumbs mod by _scorpio_ v1.0
#-----[ FIND ]-----
$thumbnail_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id'] . '&t=1');

#-----[ REPLACE ]-----
					// $thumbnail_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id'] . '&t=1');
					// physical filename attachment and thumbs mod by _scorpio_ v1.0
					if (!@file_exists($thumbnail_filename))
					{
						$thumbnail_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id'] . '&t=1');
					} else {
						$thumbnail_link = $thumbnail_filename;
					}
					// physical filename attachment and thumbs mod by _scorpio_ v1.0

#-----[ OPEN ]-----
includes/functions_posting.php

#-----[ FIND ]-----
		@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample  ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');

#-----[ REPLACE ]-----
		// @passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample  ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');
		// physical filename attachment and thumbs mod by _scorpio_ v1.0
		@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -resize ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');
		// physical filename attachment and thumbs mod by _scorpio_ v1.0
		
#-----[ SAVE/CLOSE ALL FILES ]-----
и собственно конфиг nginx

Код: Выделить всё

user www-data;
worker_processes 10;
worker_priority -5;

# timer_resolution 100ms;
worker_rlimit_nofile 30000;

error_log  /var/log/nginx/error.log;
pid		/var/run/nginx.pid;

 events {
	worker_connections  1024;
	multi_accept on;
#	use epoll;
}

http {
	include		/etc/nginx/mime.types;
	default_type application/octet-stream;

#	limit_zone	one  $binary_remote_addr  16m;
#	limit_conn	one  50;
#	limit_req_zone  $binary_remote_addr  zone=lreq:10m	rate=2r/s;

	log_format main '$remote_addr - $remote_user [$time_local] $request '
	'"$status" $body_bytes_sent "$http_referer" '
	'"$http_user_agent" "$http_x_forwarded_for"';


	access_log  /var/log/nginx/access.log;

	sendfile		 on;
	tcp_nopush		on;
	tcp_nodelay	  on;
#	send_lowat		12000;

server_tokens off;
server_names_hash_bucket_size 512;

#	keepalive_timeout  65;
	keepalive_timeout  75 30;

	#lingering_time	 30;
	#lingering_timeout  10;
	#reset_timedout_connection  on;

#	client_header_timeout  3m;
#	client_body_timeout	3m;
	send_timeout			30s;
	reset_timedout_connection	on;
	resolver			127.0.0.1;
	resolver_timeout	10s;
	fastcgi_connect_timeout 20;
	client_max_body_size 50m;

	open_file_cache			 max=100000 inactive=40s;
	open_file_cache_valid		60s;
	open_file_cache_min_uses	2;
	open_file_cache_errors	  on;

	client_header_buffer_size	1k;
	large_client_header_buffers  4 4k;

	output_buffers	1 32k;
	postpone_output  1460;

	gzip  on;
	gzip_min_length 1100;
	gzip_buffers 4 8k;
	gzip_comp_level 3;
	gzip_http_version 1.1;
	gzip_proxied any;
	gzip_types text/plain application/xml application/x-javascript text/css;
	gzip_disable "MSIE [1-6]\.(?!.*SV1)";

	server {
		listen *:80;
		server_name forum.mydomen.com.ua;
		access_log /var/log/nginx/forum.access.log;
		error_log /var/log/nginx/forum.error.log;
		root /var/www/forum;
		location / {
			index index.php index.html;
			# пример реврайта
			# rewrite ^/faq.html$ /faq.php last;
		}
		location ~* \.(jpg|jpeg|gif|png|bmp|ico|swf|flv|css|xml|rss|txt|js)$ {
			allow all;
			expires max;
		}
		location ~ /(\.ht|config\.php|common\.php|files|includes|cache|store|images/avatars/upload/) {
			deny all;
			internal;
		}
		location ~ \.php$ {
			fastcgi_param	SCRIPT_FILENAME		$document_root$fastcgi_script_name;
			fastcgi_param	SCRIPT_NAME			$fastcgi_script_name;
			fastcgi_param	PATH_INFO			$fastcgi_script_name;
			fastcgi_pass	unix:/var/sock/php5-fpm.sock;
			fastcgi_pass_request_body	off;
			client_body_in_file_only	clean;
			fastcgi_param	REQUEST_BODY_FILE	$request_body_file;
			fastcgi_param	CONTENT_TYPE		$content_type;
			fastcgi_param	CONTENT_LENGTH  	$content_length;
			fastcgi_param	DOCUMENT_ROOT		$document_root;
			fastcgi_param	DOCUMENT_URI		$document_uri;
			fastcgi_param	GATEWAY_INTERFACE	CGI/1.1;
			fastcgi_param	QUERY_STRING		$args;
			fastcgi_param	REMOTE_ADDR			$remote_addr;
			fastcgi_param	REMOTE_PORT			$remote_port;
			fastcgi_param	REQUEST_URI			$request_uri;
			fastcgi_param	REQUEST_METHOD		$request_method;
			fastcgi_param	SERVER_ADDR			$server_addr;
			fastcgi_param	SERVER_NAME			$server_name;
			fastcgi_param	SERVER_PORT			$server_port;
			fastcgi_param	SERVER_PROTOCOL		$server_protocol;
			fastcgi_param	SERVER_SOFTWARE		nginx/$server_name;
			fastcgi_param	REDIRECT_STATUS		200;
			fastcgi_index	index.php;
			fastcgi_intercept_errors on;
		}
	}
	
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

filmtablette
phpBB 1.2.1
Сообщения: 22
Зарегистрирован: 27.06.2012 19:56
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение filmtablette » 27.06.2012 20:06

ZhAN писал(а):

Код: Выделить всё

UPDATE phpbb_attachments SET thumbnail = 1 WHERE extension IN ('jpg','jpeg','gif','png','tiff')
мне не совсем понятно, где находится эта строчка?

Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Зарегистрирован: 24.05.2006 23:20
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 453 раза

Re: Создание миниатюр по мере необходимости (thumb_*)

Сообщение Палыч » 28.06.2012 18:25

filmtablette
Нигде.
Это SQL инструкция. Её нужно скормить используемому вами менеджеру базы данных (например, phpmyadmin)
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.

Вернуться в «Для авторов (phpBB 3.0.x)»