Работа Фотогалереи при большом количестве материалов (тестдрайв)

+13
2.22K
Во многих популярных CMS уязвимым местом в плане нагрузки на хостинг является фотогалерея. Мне стало интересно, как же себя поведет InstantCMS.

Иллюстрация



По правде говоря, идея тестирования пришла не просто так, в планах перевести довольно большой сайт, собранный на коленке из нескольких скриптов.

Один мой знакомый говорил — "Не ломай, то что работает", я решил опровергнуть это утверждение.

Для начала я должен убедиться, что Инстант будет легко работать при большом количестве материалов и при приличной аудитории. Началом решил выбрать фотогалерею.

Исходные данные:
InstantCMS 1.7 с настройками "по умолчанию"
localhost с установленной сборкой сервера Vertrigo (Apache 2.0.64, PHP 5.2.17, MySQL 5.0.91)

Заливал картинки в рукопашную через админку используя "Массовую загрузку фото". К двум имеющимся альбомам было создано ещё 200 пустых ("0001"-"0200").

2 теста: 1) много фото в одном альбоме 2) много альбомов

1) В первый альбом залил 2101 фотографию (скрин выше), в тот момент остальных альбомов ещё не было.

Иллюстрация

Наблюдения: всё отлично летает, навигация по страницам с фотографиями прекрасная, никаких проблем, задержек.

2) Создано 200 новых альбомов, в каждый загружено по 50 фотографий, суммарно 10к, итого 12к фото в фотогалерее.

Иллюстрация

Наблюдения: уже в процессе наполнения начались тормоза при открытии списка альбомов "localhost/photos", когда была заполнена первая сотня альбомов процесс обновления странички составлял порядка 20 секунд, но это меня не остановило, я продолжил и наполнил все 200 альбомов. По умолчанию в Инстанте все альбомы выводятся единым списком, поэтому итог стал печальным, процесс открытия страницы с альбомами занимает порядка 30 секунд на локалхосте (компьютер 2,8GHz, 2Gb) и то только если открывать одновременно одну страницу. Времени на исполнение php было выделено 60 секунд, при открытии одновременно 2-х страниц с альбомами они открывались только к концу таймаута, при открытии большего кол-ва страниц открывалась максимум одна, остальные падали в эррор.

Хочу спросить совета, куда теперь двигаться, как оптимизировать альбомы? Внутри каждого альбома проблем нет, всё летает.

"По умолчанию" в настройках фотогалереи стоит случайный показ мини-эскизов, даст ли это существенную разгрузку? И ещё, как сделать постраничную нафигацию?

Что порадовало. Количество фотографий практически никак не сказалось на размере базы данных, 12к фоток и 200 альбомов занимают ВСЕГО 1,2 Мегабайта! Так мало я ещё никогда не видел ни в одной популярной cms.

Иллюстрация

Работа галереи внутри альбомов практически незаметна, что альбом с 2к фото, что 50 (пробовал с разным "Выводом фотографий").

Прошу оказать помощь советами с оптимизацией списка галерей.

Следующей на тесте будет "Доска объявлений".

UPD:

По совету, отключил в настройках вывод эскизов. К сожалению результата не дало, засек на секундомере, окно ниже открывалось 25 секунд, при отключении блок с последними фото эффекта никакого тоже не принесло, теже 25 секунд.
Иллюстрация
0
WALTERZ WALTERZ 13 лет назад #
У меня 2 тысячи изображений в 7 альбомах, больших нагрузок не наблюдалось.
0
futuristian futuristian 13 лет назад #
А у меня 25 тысяч фотографий в более чем тысячи папках и мне нужно будет это разместить :)
0
13 лет назад #
На три альбома около 5 тысяч фотографий, проблем нет пока
0
futuristian futuristian 13 лет назад #
А есть ли тут у кого именно много альбомов, а не фото?
+2
Fuze Fuze 13 лет назад #
1. данный материал необходимо было писать на форуме (см. правила сайта)
2. вы упустили огласить конфигурационные файлы своего софта.
3. необходимы соответствующие индексы в таблицах
4. в каждом конкретном случае необходимо оптимизировать запросы, согласно требований - движок - это в первую очередь универсальность.
5. ваш запрос (который вероятно тормозит) находится в файле \components\photos\model.php
метод getSubAlbums
Код PHP:
        $sql = "SELECT a.*, IFNULL(COUNT(f.id), 0) as content_count
                FROM cms_photo_albums a
                LEFT JOIN cms_photo_files f ON f.album_id = a.id AND f.published = 1
                WHERE (a.parent_id=$parent_id) AND a.published = 1 AND a.NSDiffer = '{$differ}'
                GROUP BY a.id
                ORDER BY $albums_orderby $albums_orderto";
попробуйте заменить его на
Код PHP:
        $sql = "SELECT a.*
                FROM cms_photo_albums a
                WHERE (a.parent_id=$parent_id) AND a.published = 1 AND a.NSDiffer = '{$differ}'";
+5
Madmax Madmax 13 лет назад #
Fuze, ходатайствую - пусть такие монументальные исследования автор пишет лучше здесь - в теме на форуме - флудом "прорастет", а тут если что, только комментарии зачистить ...
+2
Fuze Fuze 13 лет назад #

Максим, хорошо)))

Автору: все же я склоняюсь к тому, что у вас проблема с настройкой сервера, ибо 2000 фото это ничто, даже на базе без индексов.

> По совету, отключил в настройках вывод эскизов.

вас не правильно информировали, это вам ничего не даст.

+1
Madmax Madmax 13 лет назад #
Игорь каюсь - информировал я ...
"Признаю свою вину - меру - степень - глубину )"
0
futuristian futuristian 13 лет назад #
Я долго думал над тем куда написать данный пост, хотелось сделать его похожим на обзор тестирования, а получилось, как разборки моих проблем, извиняйте :) 2. вы упустили огласить конфигурационные файлы своего софта. это настройки серверной части - http://img97.imageshack.us/img97/6372/20110225210913.jpg 3. необходимы соответствующие индексы в таблицах Для чистоты эксперимента и упрощения моделирования, настроек Инстанта не менял после установки. 5. ваш запрос (который вероятно тормозит) находится в файле \components\photos\model.php Выполнил данную рекомендацию, скорость открытия списка с альбомами действительно возросла причем, как с эскизами, так и без. Только потерялся вывод количества фотографий в альбоме и порядок сортировки "По дате - По убыванию", теперь она такая, как на скриншоте ниже, как бы не была установлена. Если количество фотографий не важно, то вот сортировку жаль. http://img823.imageshack.us/img823/422/20110225212712.jpg
0
futuristian futuristian 13 лет назад #
Продолжение на форуме http://instantcms.ru/forum/thread5976.html
0
Fuze Fuze 13 лет назад #
давайте здесь продолжать, что уж теперь метаться...
0
futuristian futuristian 13 лет назад #
Тогда. Проблема остается решенной наполовину, либо решенной путем удаления части довольно важного функционала сортировки.
-1
picaboo picaboo 13 лет назад #
я к сожалению больше теоретик :)) и в мускулах не шарю совсем. но мне непонятно зачем идет подсчет количества фото в категориях и стоят ли эти тормоза тех заветных циферок в скобочках. вообще список фотоальбомов кешироваться же вроде должен? закешивали. при добавлении нового кеш сбросили. или вообще сделать вывод списка альбомов независимым от других условий. чисто хранить в кеше. а превьюхи и подсчет количество через ajax подгружать динамически по очереди если кешь сбросился и идет его регенерация. кому не надо - тому пофиг. а кому интересно посмотрит в реалтайме как циферки подгружаются.
0
Fuze Fuze 13 лет назад #
я к сожалению больше теоретик :)) и в мускулах не шарю совсем
может разумнее тогда не высказываться по данной теме...
-4
picaboo picaboo 13 лет назад #
прости о божественный. впредь буду робко молчать :)
0
Виктор Виктор 13 лет назад #
А если кастрировать запрос не так сильно, как предложил уважаемый fuze?
По идее вот это:
$sql = "SELECT a.*, IFNULL(COUNT(f.id), 0) as content_count
FROM cms_photo_albums a
WHERE (a.parent_id=$parent_id) AND a.published = 1 AND a.NSDiffer = '{$differ}'
ORDER BY $albums_orderby $albums_orderto";
должно дать и общее количество и сортировку.
Вот что со скоростью - надо проверять.
0
Виктор Виктор 13 лет назад #
извиняюсь, в запросе f.id нужнл заменить на a.id/
Должно стать:
Код PHP:
$sql = "SELECT a.*, IFNULL(COUNT(a.id), 0) as content_count
        FROM cms_photo_albums a
        WHERE (a.parent_id=$parent_id) AND a.published = 1 AND a.NSDiffer = '{$differ}'
        ORDER BY $albums_orderby $albums_orderto";
0
futuristian futuristian 13 лет назад #
Вот такой результат
+1
Fuze Fuze 13 лет назад #
должно дать и общее количество

общего количества это не даст, т.к. не присоединяется таблица с фото

вот так можно:

Код PHP:
$sql = "SELECT a.*
        FROM cms_photo_albums a
        WHERE (a.parent_id=$parent_id) AND a.published = 1 AND a.NSDiffer = '{$differ}'
        ORDER BY $albums_orderby $albums_orderto";

но общего количества это тоже не даст. Возможно разумней будет считать кол-во отдельными запросами. НО автору поста я рекомендую перенастроить свой mysql сервер, хотя бы с учетом кол-ва доступной оперативной памяти. Погуглите на тему настройка mysql.

0
futuristian futuristian 13 лет назад #
Ура. Теперь и сортировка работает и с рандомными эскизами всё в порядке.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.