This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
ru:tcms_install [2016/11/29 08:41] admin |
ru:tcms_install [2022/07/04 12:56] (current) admin [Default Rewrites] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Trade CMS ====== | ||
+ | Thumb CMS - это следующий шаг в развитии SmartCJ. | ||
+ | |||
+ | Мы всегда старались поддерживать все возможные конфигурации серверов, | ||
+ | |||
+ | ===== What's new ===== | ||
+ | |||
+ | В новой ветке есть ряд качественных изменений для всех сторон скрипта. | ||
+ | |||
+ | * Была произведена оптимизация базы, дабы сделать возможным быструю работу баз по с 200-300к тумб в каждой категории. Ранее это была проблема, | ||
+ | * Кроны можно запускать как угодно часто, это будет влиять только на скорость обновления статистики и сохранениях хистори. При этом кроны контролируют запуск себя дабы не запускались дубли. Однако в связи с пунктом 1 это воможно не понадобится. | ||
+ | * Оптимизированы выборки и апдейты базы | ||
+ | |||
+ | |||
+ | Скрипт стал полностью " | ||
+ | |||
+ | * Вы можете ставить скрипт в любую папку | ||
+ | * Реврайты упрощены, | ||
+ | * Скрипт не ставит никаких кук в режиме Cookie Engine = Cache либо ставит закодированные в режиме Cookie Engine = MD5 | ||
+ | * Можно убирать [[TCMS Rotation Parameter]] и скрипт все равно сможет считать статистику тумб, даже если их несколько на галеру + [[Cell K]] | ||
+ | |||
+ | Таким образом вопрос о ранжировании сайтов гуглом в зависимости от скрипта будет полностью снят. | ||
+ | |||
+ | Добавлен ряд уникальных фич: | ||
+ | |||
+ | * [[Thumb Split]] - уникализация тумб путем разрезания их на несколько частей | ||
+ | * [[FaceDetect]] - автоматизация нарезки тумб, с учетом положения лица для того что бы создавать тумбы более качественно на автомате | ||
+ | |||
+ | |||
+ | |||
+ | ===== Installation ===== | ||
+ | |||
+ | Установка стала еще проще и должна понравиться админам. Сейчас можно ничего не скачивать, | ||
+ | |||
+ | < | ||
+ | curl -sS http:// | ||
+ | </ | ||
+ | |||
+ | и скрипт будет установлен в интерактивном режиме. | ||
+ | PS да, два тире в конце обязательны | ||
+ | |||
+ | так же можно указать все параметры прямо в коммандной строке | ||
+ | |||
+ | < | ||
+ | curl -sS http:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Default Rewrites ===== | ||
+ | |||
+ | |||
+ | < | ||
+ | RewriteEngine On | ||
+ | |||
+ | RewriteBase / | ||
+ | RewriteCond %{REQUEST_FILENAME} !-f | ||
+ | RewriteCond %{REQUEST_FILENAME} !-d | ||
+ | RewriteRule ^([^/ | ||
+ | |||
+ | |||
+ | # add & | ||
+ | RewriteRule ^category/ | ||
+ | RewriteRule ^category/ | ||
+ | |||
+ | #slug galleries | ||
+ | RewriteRule ^gallery/ | ||
+ | RewriteRule ^gallery/ | ||
+ | |||
+ | #tags | ||
+ | RewriteRule ^tag/ | ||
+ | RewriteRule ^tag/ | ||
+ | RewriteRule ^tag/ | ||
+ | |||
+ | #model galleries | ||
+ | RewriteRule ^model_galleries/ | ||
+ | RewriteRule ^model_galleries/ | ||
+ | |||
+ | RewriteRule ^model/ | ||
+ | RewriteRule ^model/ | ||
+ | |||
+ | RewriteRule ^search/ | ||
+ | RewriteRule ^search/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Для nginx | ||
+ | |||
+ | < | ||
+ | |||
+ | server { | ||
+ | | ||
+ | .... | ||
+ | | ||
+ | | ||
+ | | ||
+ | location / | ||
+ | return 404; | ||
+ | } | ||
+ | |||
+ | location / { | ||
+ | |||
+ | ..... | ||
+ | |||
+ | if (!-e $request_filename) { | ||
+ | rewrite " | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | location /gallery { | ||
+ | rewrite ^/ | ||
+ | rewrite " | ||
+ | } | ||
+ | |||
+ | location /category { | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | |||
+ | location /tag { | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | |||
+ | |||
+ | location / | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | |||
+ | location /model { | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | |||
+ | location /search { | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Search ===== | ||
+ | |||
+ | По дефолту для поиска используется конструкция примерно WHERE description LIKE ' | ||
+ | |||
+ | Search fields | ||
+ | If you don't use Sphinx the script will use Mysql | ||
+ | built-in functionality. It's slower so we limit amount of fields | ||
+ | Please, read the last WIKI about the last option. | ||
+ | |||
+ | |||
+ | По дефолту скрипт ищет по в description, | ||
+ | |||
+ | Лучший вариант - это настройка Sphinx о чем рассказано ниже. | ||
+ | |||
+ | Но есть компромисный вариант: | ||
+ | |||
+ | Итого если вы хотите использовать этот вариант, | ||
+ | |||
+ | < | ||
+ | ALTER TABLE `rot_gallery_data1` ADD FULLTEXT ( | ||
+ | `alt` , | ||
+ | `description` | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | И переключить в настройках опцию на поиск FullText. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Sphinx Config ===== | ||
+ | |||
+ | Обратите внимание, | ||
+ | |||
+ | Пример конфига | ||
+ | |||
+ | < | ||
+ | |||
+ | Надо внести изменения в секцию | ||
+ | |||
+ | searchd | ||
+ | { | ||
+ | listen | ||
+ | |||
+ | основное тут - добавление mysql41, новый вариант для сфинкс слушать по протоколу mysql | ||
+ | |||
+ | Далее пример для базы | ||
+ | |||
+ | source your_name_source | ||
+ | { | ||
+ | type = mysql | ||
+ | |||
+ | sql_host = localhost | ||
+ | sql_user = | ||
+ | sql_pass = | ||
+ | sql_db = | ||
+ | sql_port = 3306 # optional, default is 3306 | ||
+ | |||
+ | sql_query_pre = SET NAMES utf8 | ||
+ | |||
+ | sql_query = SELECT gi.gallery_id, | ||
+ | (SELECT group_concat(tag_name) FROM rot_gal2tag g2t \ | ||
+ | LEFT JOIN rot_tags as t on t.tag_id = g2t.tag_id \ | ||
+ | WHERE g2t.gallery_id = gi.gallery_id) as tags, \ | ||
+ | (SELECT group_concat(tag_id) FROM rot_gal2tag g2t \ | ||
+ | WHERE g2t.gallery_id = gi.gallery_id) as tag_ids, \ | ||
+ | (SELECT group_concat(name) FROM rot_groups | ||
+ | WHERE rot_groups.id in (SELECT group_id FROM rot_gallery_stats1 WHERE rot_gallery_stats1.gallery_id = gi.gallery_id AND group_id != 0) ) as group_names, | ||
+ | \ | ||
+ | (SELECT group_concat(name) FROM rot_groups | ||
+ | WHERE rot_groups.id in (SELECT group_id FROM rot_gallery_stats1 WHERE rot_gallery_stats1.gallery_id = gi.gallery_id AND group_id != 0) ) as group_names, | ||
+ | |||
+ | (SELECT group_concat(gss.group_id) FROM rot_gallery_stats1 as gss \ | ||
+ | WHERE gss.gallery_id = gi.gallery_id AND group_id != 0) as categories \ | ||
+ | FROM rot_gallery_info AS gi \ | ||
+ | JOIN rot_gallery_data1 AS gd ON gi.gallery_id = gd.gallery_id \ | ||
+ | JOIN rot_gallery_stats1 AS gs ON gs.gallery_id = gi.gallery_id \ | ||
+ | WHERE gallery_status = ' | ||
+ | and gs.best_thumb = ' | ||
+ | |||
+ | |||
+ | sql_attr_timestamp = date | ||
+ | sql_attr_uint | ||
+ | sql_attr_uint | ||
+ | sql_attr_float | ||
+ | sql_attr_uint | ||
+ | sql_attr_multi = uint categories from field; | ||
+ | sql_attr_multi = uint tag_ids from field; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | index your_name_index | ||
+ | { | ||
+ | source = your_name_source | ||
+ | path = /your_path | ||
+ | docinfo = extern | ||
+ | morphology | ||
+ | charset_type = utf-8 | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Sphinx Delta Config ===== | ||
+ | |||
+ | При создании индекса sphinx делает индекс текущего состояния базы и если после индексирования в базе были какие-либо изменения, | ||
+ | |||
+ | Логический вывод из этого: надо проводить реиндексацию после каждого изменения в базе, однако проблема в том, что | ||
+ | |||
+ | Что бы решить эту проблему придумали delta index – это индекс в который попадут измения, | ||
+ | |||
+ | При поиска sphinx будет искать и в основном индексе и в дельта индексе, | ||
+ | |||
+ | |||
+ | Итого : | ||
+ | |||
+ | в основную часть, которая у вас уже есть надо добавить после | ||
+ | |||
+ | sql_query_pre = SET NAMES utf8 | ||
+ | |||
+ | строку | ||
+ | |||
+ | sql_query_pre = UPDATE rot_settings SET value = (SELECT MAX(gallery_id) FROM rot_gallery_info) WHERE name = ' | ||
+ | |||
+ | |||
+ | Теперь надо добавить создание дельта индекса | ||
+ | |||
+ | < | ||
+ | |||
+ | source delta : your_name_source | ||
+ | { | ||
+ | sql_query_pre = SET NAMES utf8 | ||
+ | |||
+ | sql_query = SELECT gi.gallery_id, | ||
+ | \ | ||
+ | gd.alt, gd.description, | ||
+ | \ | ||
+ | \ | ||
+ | (SELECT group_concat(tag_id) FROM rot_gal2tag g2t \ | ||
+ | WHERE g2t.gallery_id = gi.gallery_id) as tag_ids, | ||
+ | \ | ||
+ | # TAGS START you can remove this part up to TAG END \ | ||
+ | # this part indexes tags, if you remove it - tags wont be indexed | ||
+ | # ligther index = less memory usage and faster search | ||
+ | (SELECT group_concat(tag_name) FROM rot_gal2tag g2t \ | ||
+ | LEFT JOIN rot_tags as t on t.tag_id = g2t.tag_id | ||
+ | WHERE g2t.gallery_id = gi.gallery_id) as tags, \ | ||
+ | \ | ||
+ | # TAGS END \ | ||
+ | \ | ||
+ | \ | ||
+ | # GROUP START you can remove this part up to TAG END \ | ||
+ | # this part indexes group names, if you remove it - it wont be indexed | ||
+ | # ligther index = less memory usage and faster search | ||
+ | (SELECT group_concat(name) FROM rot_groups | ||
+ | WHERE rot_groups.id in (SELECT group_id FROM rot_gallery_stats1 | ||
+ | WHERE rot_gallery_stats1.gallery_id = gi.gallery_id AND group_id != 0) \ | ||
+ | ) as group_names, | ||
+ | \ | ||
+ | \ | ||
+ | # GROUP END \ | ||
+ | \ | ||
+ | # Models START you can remove this part up to MODEL END \ | ||
+ | # this part indexes model names, if you remove it - it wont be indexed | ||
+ | # ligther index = less memory usage and faster search | ||
+ | (SELECT group_concat(model_name) FROM rot_models | ||
+ | WHERE rot_models.model_id in (SELECT model_id FROM rot_gal2model | ||
+ | WHERE rot_gal2model.gallery_id = gi.gallery_id) | ||
+ | ) as model_names, | ||
+ | \ | ||
+ | # MODEL END \ | ||
+ | \ | ||
+ | \ | ||
+ | (SELECT group_concat(distinct(gss.group_id)) FROM rot_gallery_stats1 as gss \ | ||
+ | WHERE gss.gallery_id = gi.gallery_id AND group_id != 0) as categories | ||
+ | \ | ||
+ | FROM rot_gallery_info AS gi \ | ||
+ | JOIN rot_sponsors on rot_sponsors.sponsor_id = gi.sponsor_id | ||
+ | JOIN rot_gallery_data1 AS gd ON gi.gallery_id = gd.gallery_id | ||
+ | \ | ||
+ | \ | ||
+ | JOIN rot_gallery_stats1 AS gs ON gs.gallery_id = gi.gallery_id | ||
+ | WHERE gallery_status = ' | ||
+ | and gs.best_thumb = ' | ||
+ | AND gs.group_id NOT IN (SELECT group_id FROM rot_groups_data WHERE status != 1) and gi.gallery_id > ( SELECT value FROM rot_settings WHERE name = ' | ||
+ | | ||
+ | } | ||
+ | |||
+ | |||
+ | index delta : your_name_index | ||
+ | { | ||
+ | source = delta | ||
+ | path = / | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Как можно заметить запрос такой же, отличается только наличием в выборке по sphinx_max_gallery_id. | ||
+ | |||
+ | После этого надо доабвить в крон индексацию новых записей так часто, как вам нравится строкой | ||
+ | |||
+ | indexer --rotate delta | ||
+ | |||
+ | После создания индекса надо прописать delta в Sphinx Delta Index настройках ротации. | ||
+ | |||
+ | и раз в сутки например можно присоединять дельта индекс к основному | ||
+ | |||
+ | indexer --rotate --merge your_name_index delta | ||
+ | |||
+ | |||
+ | Все. |