Topic List Previews (legacy)

Привет, спасибо за отличный плагин!

К сожалению, после последнего обновления изображения, которые размещены не напрямую на Discourse, больше не отображаются в режиме «Сетка» или «Плитка». Не могли бы вы это проверить?

Например, если в посте есть изображение с другого сервера (Blogger, Picasa и т. д.), оно больше не отображается. Раньше всё работало отлично и без проблем.

1 лайк

Теперь миниатюры генерируются ядром Discourse, и у меня теперь мало влияния на этот процесс.

Значительная часть логики генерации миниатюр была удалена и передана в ведение Discourse.

Возможно, вам стоит поднять этот вопрос здесь: Theme modifiers: A brief introduction

2 лайка

Спасибо! Я только что оставил там ответ. Все эти обновления вызывают некоторую настороженность, поскольку все мои изображения размещены не на локальном сервере.

2 лайка

Я полагаю, что это всё ещё должно работать, если ваши «загрузки» размещены на удалённом сервере через настройки, но теперь прямые ссылки на удалённые сайты и сторонние организации, не связанные с нами, больше не будут поддерживаться.

Учитывая, что эта часть кода теперь обрабатывается ядром, нет смысла управлять ею в плагине. Вы абсолютно правы, что обратились к ним напрямую :+1:

4 лайка

Спасибо. Я понимаю ситуацию. Для моего сайта это непростое решение, так как мы используем другой сервер для размещения изображений. Сейчас перенести их на связанный сервер с большим количеством публикаций слишком сложно, а для локального сервера объем данных слишком велик.

1 лайк

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

У меня миниатюры отображаются нормально. Вы уверены, что обновили Events согласно инструкции от @fzngagan?

2 лайка

Он, должно быть, объединил это сразу после того, как я протестировал. Спасибо, ребята, всё теперь работает!

3 лайка

Я обновился вчера, и производительность стала довольно низкой. Анализ профилировщика показывает этот запрос от TLP, который, похоже, и является причиной — возможно, здесь не хватает индекса?

Что интересно, этот запрос всё ещё появляется, когда я запускаю сайт в безопасном режиме :thinking:

1 лайк

Функция «Изображения». Этот запрос не менялся уже очень давно (годами!). Вы уверены, что это новая проблема?

Вы сортируете по дате создания тега? Это почти наверняка приведёт к запутанному запросу. Сортировка по «Последним» будет более щадящей.

Вы всегда можете временно отключить эту функцию.

Компонент темы использует базовый API. Если это вызывает у вас проблемы, вы можете временно переключиться и использовать его.

1 лайк

Думаю, это нововведение появилось после обновления до PG12. И нам действительно нужна сортировка по дате создания тега — это одна из ключевых «функций» нашего сообщества. Чего бы я лишился, если перейду на TC?

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

2 лайка

Вы уверены, что обновление PG 12 завершило повторную индексацию? Многие пользователи сообщали о периоде снижения производительности во время этого процесса (и эти сообщения не были связаны с TLP).

Кстати, если подумать, возможно, что-то ещё изменилось: теперь требуется соединение с таблицей topic_thumbnails, но это произошло довольно давно, и других жалоб не было. Мне кажется, раньше использовалась прямая ссылка на image_url в объекте Topic, что было быстрее (на одно соединение меньше), но из-за изменений в ядре это больше невозможно. Возможно, это тоже влияет.

1 лайк

Да, переиндексация завершена. Сортировка по дате создания темы имеет ту же проблему. Вот вывод EXPLAIN для обоих запросов:

Сортировка по дате тегирования:

discourse=# explain SELECT "topics"."id", "topics"."title", "topics"."last_posted_at", "topics"."created_at", "topics"."updated_at", "topics"."views", "topics"."posts_count", "topics"."user_id", "topics"."last_post_user_id", "topics"."reply_count", "topics"."featured_user1_id", "topics"."featured_user2_id", "topics"."featured_user3_id", "topics"."deleted_at", "topics"."highest_post_number", "topics"."like_count", "topics"."incoming_link_count", "topics"."category_id", "topics"."visible", "topics"."moderator_posts_count", "topics"."closed", "topics"."archived", "topics"."bumped_at", "topics"."has_summary", "topics"."archetype", "topics"."featured_user4_id", "topics"."notify_moderators_count", "topics"."spam_count", "topics"."pinned_at", "topics"."score", "topics"."percent_rank", "topics"."subtype", "topics"."slug", "topics"."deleted_by_id", "topics"."participant_count", "topics"."word_count", "topics"."excerpt", "topics"."pinned_globally", "topics"."pinned_until", "topics"."fancy_title", "topics"."highest_staff_post_number", "topics"."featured_link", "topics"."reviewable_score", "topics"."image_upload_id" 
discourse-# FROM "topics" 
discourse-# INNER JOIN "topic_tags" 
discourse-# ON "topic_tags"."topic_id" = "topics"."id" 
discourse-# INNER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" 
discourse-# WHERE ("topics"."deleted_at" IS NULL) 
discourse-# AND "topics"."visible" = TRUE 
discourse-# AND (NOT topics.closed AND NOT topics.archived AND topics.deleted_at IS NULL) 
discourse-# AND (topics.image_upload_id in (
discourse(#         SELECT image_upload_id FROM topic_thumbnails
discourse(#       ))
discourse-# AND (tags.id IN (1)) 
discourse-# 
discourse-# ORDER BY (
discourse(#  SELECT created_at FROM topic_tags
discourse(#         WHERE topic_id = topics.id
discourse(#         AND tag_id IN (1)
discourse(#         LIMIT 1
discourse(# )
discourse-# 
discourse-# DESC LIMIT 6; 
                                                                    QUERY PLAN                                                         
            
---------------------------------------------------------------------------------------------------------------------------------------
------------
 Limit  (cost=2631719.94..2631719.95 rows=6 width=569)
   ->  Sort  (cost=2631719.94..2631721.73 rows=717 width=569)
         Sort Key: ((SubPlan 1)) DESC
         ->  Nested Loop  (cost=0.43..2631707.09 rows=717 width=569)
               ->  Seq Scan on tags  (cost=0.00..4.51 rows=1 width=4)
                     Filter: (id = 1)
               ->  Nested Loop  (cost=0.43..2625737.13 rows=717 width=565)
                     ->  Seq Scan on topic_tags  (cost=0.00..860.33 rows=1539 width=8)
                           Filter: (tag_id = 1)
                     ->  Index Scan using topics_pkey on topics  (cost=0.43..1705.57 rows=1 width=561)
                           Index Cond: (id = topic_tags.topic_id)
                           Filter: ((deleted_at IS NULL) AND visible AND (NOT closed) AND (NOT archived) AND (deleted_at IS NULL) AND (
SubPlan 2))
                           SubPlan 2
                             ->  Seq Scan on topic_thumbnails  (cost=0.00..2966.64 rows=171664 width=8)
               SubPlan 1
                 ->  Limit  (cost=0.29..8.31 rows=1 width=8)
                       ->  Index Scan using index_topic_tags_on_topic_id_and_tag_id on topic_tags topic_tags_1  (cost=0.29..8.31 rows=1
 width=8)
                             Index Cond: ((topic_id = topics.id) AND (tag_id = 1))
 JIT:
   Functions: 25
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(21 rows)

Сортировка по дате темы:

discourse=# explain SELECT "topics"."id", "topics"."title", "topics"."last_posted_at", "topics"."created_at", "topics"."updated_at", "topics"."views", "topics"."posts_count", "topics"."user_id", "topics"."last_post_user_id", "topics"."reply_count", "topics"."featured_user1_id", "topics"."featured_user2_id", "topics"."featured_user3_id", "topics"."deleted_at", "topics"."highest_post_number", "topics"."like_count", "topics"."incoming_link_count", "topics"."category_id", "topics"."visible", "topics"."moderator_posts_count", "topics"."closed", "topics"."archived", "topics"."bumped_at", "topics"."has_summary", "topics"."archetype", "topics"."featured_user4_id", "topics"."notify_moderators_count", "topics"."spam_count", "topics"."pinned_at", "topics"."score", "topics"."percent_rank", "topics"."subtype", "topics"."slug", "topics"."deleted_by_id", "topics"."participant_count", "topics"."word_count", "topics"."excerpt", "topics"."pinned_globally", "topics"."pinned_until", "topics"."fancy_title", "topics"."highest_staff_post_number", "topics"."featured_link", "topics"."reviewable_score", "topics"."image_upload_id" FROM "topics" INNER JOIN "topic_tags" ON "topic_tags"."topic_id" = "topics"."id" INNER JOIN "tags" ON "tags"."id" = "topic_tags"."tag_id" WHERE ("topics"."deleted_at" IS NULL) AND "topics"."visible" = TRUE AND (NOT topics.closed AND NOT topics.archived AND topics.deleted_at IS NULL) AND (topics.image_upload_id in (
        SELECT image_upload_id FROM topic_thumbnails
      )) AND (tags.id IN (1)) ORDER BY (SELECT created_at FROM topic_tags
        WHERE topic_id = topics.id
        AND tag_id IN (1)
        LIMIT 1)
        DESC LIMIT 6; 
                                                                    QUERY PLAN                                                         
            
---------------------------------------------------------------------------------------------------------------------------------------
------------
 Limit  (cost=2631719.94..2631719.95 rows=6 width=569)
   ->  Sort  (cost=2631719.94..2631721.73 rows=717 width=569)
         Sort Key: ((SubPlan 1)) DESC
         ->  Nested Loop  (cost=0.43..2631707.09 rows=717 width=569)
               ->  Seq Scan on tags  (cost=0.00..4.51 rows=1 width=4)
                     Filter: (id = 1)
               ->  Nested Loop  (cost=0.43..2625737.13 rows=717 width=565)
                     ->  Seq Scan on topic_tags  (cost=0.00..860.33 rows=1539 width=8)
                           Filter: (tag_id = 1)
                     ->  Index Scan using topics_pkey on topics  (cost=0.43..1705.57 rows=1 width=561)
                           Index Cond: (id = topic_tags.topic_id)
                           Filter: ((deleted_at IS NULL) AND visible AND (NOT closed) AND (NOT archived) AND (deleted_at IS NULL) AND (
SubPlan 2))
                           SubPlan 2
                             ->  Seq Scan on topic_thumbnails  (cost=0.00..2966.64 rows=171664 width=8)
               SubPlan 1
                 ->  Limit  (cost=0.29..8.31 rows=1 width=8)
                       ->  Index Scan using index_topic_tags_on_topic_id_and_tag_id on topic_tags topic_tags_1  (cost=0.29..8.31 rows=1
 width=8)
                             Index Cond: ((topic_id = topics.id) AND (tag_id = 1))
 JIT:
   Functions: 25
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(21 rows)
2 лайка

Полезно. Спасибо.

Извините, не уверен, когда смогу заняться этим.

Также имейте в виду, что новый join может быть улучшен но я не могу от него избавиться. (о, да, я мог бы!).

1 лайк

Окей, я работал с @bartv офлайн, чтобы улучшить это.

Это касается только плагина, а не TC:

Рекомендую обновиться, чтобы воспользоваться этим, так как это значительное улучшение для сайтов, использующих изображения-обложки.

5 лайков

Ты просто рок-звезда! :guitar:

3 лайка

Твои детальные расследования тоже были критически важны, Барт, спасибо

3 лайка

Привет, я добавил URL репозитория git clone в файл app.yml для контейнеров, но при попытке пересобрать приложение возникла ошибка:

(<unknown>): найден символ табуляции, нарушающий отступы при сканировании простого скаляра на строке 91, столбец 13 -e LANG=en_US.UTF-8

Из-за этого сайт не работал.

Я удалил URL репозитория git clone для плагина, и всё снова заработало.

1 лайк

Я не думаю, что ваша проблема специфична для этого плагина. В файле app.yml нельзя использовать табуляцию. Используйте пробелы.

2 лайка

Понял, извините. Я скопировал последнюю строку плагина и изменил URL для git clone. Теперь всё работает, спасибо :slight_smile:

2 лайка