Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

IPS Downloads: проблема с категориями на главной

Опубликовано:

И снова этот Downloads, я наверное уже достал всех с ним 🙂

Обнаружил очень неприятную штуку, которой не было в 3.4. Вводные такие: в загрузках около 1500 категорий в общем, родительских, которые отображаются в сайдбаре, где-то штук 30. Проблема в следующем: при попытке зайти на главную /files/ страница загружается 25-35 секунд! Иногда даже дольше. То есть нажали -> ждем полминуты, и потом страница моментально появляется.

Опытным путем установил, что проблема как раз заключается в сайдбаре с категориями. Попробовал вставить его на главную форума, получил ту же загрузку в полминуты. Без него загружается максимум за 2 секунды. Отмечу, что абсолютно все другие страницы сайта загружаются моментально, включая родительские категории с большим количеством подкатегорий и файлов. 

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

Файл: /applications/downloads/modules/front/downlaods/browse.php

Код:

protected function _category( $category )
	{
		\IPS\Output::i()->sidebar['contextual'] = '';
		
		$_count = \IPS\downloads\File::getItemsWithPermission( array( array( \IPS\downloads\File::$databasePrefix . \IPS\downloads\File::$databaseColumnMap['container'] . '=?', $category->_id ) ), NULL, 1, 'read', \IPS\Content\Hideable::FILTER_AUTOMATIC, 0, NULL, FALSE, FALSE, FALSE, TRUE );

		if( !$_count )
		{
			/* If we're viewing a club, set the breadcrumbs appropriately */
			if ( $club = $category->club() )
			{
				$club->setBreadcrumbs( $category );
			}
			else
			{
				foreach ( $category->parents() as $parent )
				{
					\IPS\Output::i()->breadcrumb[] = array( $parent->url(), $parent->_title );
				}
				\IPS\Output::i()->breadcrumb[] = array( NULL, $category->_title );
			}

			/* Show a 'no files' template if there's nothing to display */
			$table = \IPS\Theme::i()->getTemplate( 'browse' )->noFiles( $category );
		}
		else
		{
			/* Build table */
			$table = new \IPS\Helpers\Table\Content( 'IPS\downloads\File', $category->url(), NULL, $category );
			$table->classes = array( 'ipsDataList_large' );
			$table->sortOptions = array_merge( $table->sortOptions, array( 'file_downloads' => 'file_downloads' ) );

			if ( !$category->bitoptions['reviews_download'] )
			{
				unset( $table->sortOptions['num_reviews'] );
			}

			if ( !$category->bitoptions['comments'] )
			{
				unset( $table->sortOptions['last_comment'] );
				unset( $table->sortOptions['num_comments'] );
			}

			if ( $table->sortBy === 'downloads_files.file_title' )
			{
				$table->sortDirection = 'asc';
			}
			
			if ( \IPS\Application::appIsEnabled( 'nexus' ) and \IPS\Settings::i()->idm_nexus_on )
			{
				$table->filters = array(
					'file_free'	=> "( ( file_cost='' OR file_cost IS NULL ) AND ( file_nexus='' OR file_nexus IS NULL ) )",
					'file_paid'	=> "( file_cost<>'' OR file_nexus>0 )",
				);
			}
			$table->title = \IPS\Member::loggedIn()->language()->pluralize(  \IPS\Member::loggedIn()->language()->get('download_file_count'), array( $_count ) );
		}

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

Изменено пользователем DevilDriver
Название темы

Рекомендованные сообщения

Опубликовано:

Я бы вырезал сайдбар на главной странице: /files/

В меню сайта бы добавил ссылку на страницу с категориями для тех, кто ищет что-то: /files/categories/

И далее нанял бы тут специалиста для неспешного решения проблемы, так как проблема скорее всего глобальная.

Изменено пользователем Zero108

Опубликовано:
  • Автор
8 часов назад, Zero108 сказал:

В меню сайта бы добавил ссылку на страницу с категориями для тех, кто ищет что-то: /files/categories/

На этой странице отображаются все категории и подкатегории списком, соответственно тормозит точно так же. Кстати, она тоже использует файл browse.php, переименовал файл, обновил страницу - ошибка "Мы не можем найти это".

Опубликовано:

Это баг.

Напишите в поддержку IPS.

system/Content/Item.php

    /**
     * Total item \count(including children)
     *
     * @param    \IPS\Node\Model    $container            The container
     * @param    bool            $includeItems        If TRUE, items will be included (this should usually be true)
     * @param    bool            $includeComments    If TRUE, comments will be included
     * @param    bool            $includeReviews        If TRUE, reviews will be included
     * @param    int                $depth                Used to keep track of current depth to avoid going too deep
     * @return    int|NULL|string    When depth exceeds 10, will return "NULL" and initial call will return something like "100+"
     * @note    This method may return something like "100+" if it has lots of children to avoid exahusting memory. It is intended only for display use
     * @note    This method includes counts of hidden and unapproved content items as well
     */
    public static function contentCount( \IPS\Node\Model $container, $includeItems=TRUE, $includeComments=FALSE, $includeReviews=FALSE, $depth=0 )

1. 

        /* Add Children */
        $childDepth    = $depth++;
        foreach ( $container->children() as $child )
        {
            $toAdd = static::contentCount( $child, $includeItems, $includeComments, $includeReviews, $childDepth );

$childDepth здесь не увеличивается на единицу, что должно быть по задумке. См. документацию https://www.php.net/manual/en/language.operators.increment.php

$childDepth    = $depth++;

заменить на 

$childDepth    = ++$depth;

или на 

$childDepth    = $depth + 1;

2. В шаблоне categoriesSidebar

{number="\IPS\downloads\File::contentCount( $category )"}

и подобные конструкции.

Используется плагин number, но метод может возвращать строку. Поэтому логичнее использовать expression

Опубликовано:
  • Автор

@newbie спасибо большое, но похоже не помогло 🙄 Грузит так же долго, как и до изменений. Для более точной проверки использовал не тронутый стандартный шаблон IPS, точно такая же история. Кеши чистил, у сайта и у браузера на всякий случай.

Еще обнаружил вот что. Если запрашивать страницу ГОСТЕМ, то она грузится моментально, ~100мс судя по отладочной консоли браузера.

Опубликовано:
  • Автор

Забыл добавить, про последнее предложение про гостей: это обнаружилось еще ДО попытки правок файла Item.php и шаблона.

Опубликовано:

Удалите из шаблона весь код, связанный с 

contentCount

и проверьте

Опубликовано:
  • Автор

@newbie попробовал, тоже самое. И еще более интересная ситуация, после этого я удалил вообще весь код из шаблона categoriesSidebar, сам сайдбар пропал, но грузит точно так же долго, как и с ним. Вообще ничего не понимаю.

Опубликовано:

А Вы каким образом проверяете?

Опубликовано:
  • Автор

Простым обновлением страницы + консоль браузера с вкладкой запросы 🙂 При обновлении страницы грузит 30 секунд, в консоли пусто, потом появляется первая строка с названием страницы и временем 30000 мс, и потом резко все остальные запросы моментально появляются. 

Опубликовано:

То есть у Вас главная страница файлов всегда загружается 30 секунд?

Опубликовано:
  • Автор
1 час назад, newbie сказал:

То есть у Вас главная страница файлов всегда загружается 30 секунд?

Да, только она одна грузится в промежутке 20-30 сек. Остальные страницы сайта грузятся быстро. 

Опубликовано:

У меня нет форума с большим количеством категорий.

Если дадите данные (АЦ/фтп), то посмотрю.

Опубликовано:
  • Автор
4 минуты назад, newbie сказал:

У меня нет форума с большим количеством категорий.

Если дадите данные (АЦ/фтп), то посмотрю.

Да, без проблем, буду рад помощи. Вечером пришлю данные.

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.