Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
DevilDriver

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

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

01/29/20 12:00 (изменено)

И снова этот 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
Название темы

Поделиться сообщением


Ссылка на сообщение
01/29/20 22:59 (изменено)

Я бы вырезал сайдбар на главной странице: /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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

contentCount

и проверьте

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение
1 час назад, newbie сказал:

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

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

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение
4 минуты назад, newbie сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...