TYPO3: проблема производительности с нумерацией страниц - PullRequest
0 голосов
/ 13 января 2020

Я сейчас создаю какой-то видеоканал на основе созданного мною расширения. Он состоит из видео и плейлиста, который содержит видео (очевидно). Я должен создать страницу, которая содержит список видео и плейлист по категориям. Вы также можете отсортировать эти элементы по дате. Наконец, страница разбита на страницы с бесконечной прокруткой, которая должна загружать элементы 21 на 21. Для этого я создал в репозиториях Video и Playlist функцию «findByCategory», которая очень проста:

$query = $this->createQuery();
    return $query->matching($query->equals('categorie.uid',$categoryUid))->execute()->toArray();

Once Я запросил нужные мне элементы, объединяю их в один массив и делаю сортировку. Вот мое действие шоу контроллера:

    if ($this->request->hasArgument('sort'))
        $sort = $this->request->getArgument('sort');
    else
        $sort = 'antechrono';
    //Get videos in repositories
    $videos = $this->videoRepository->findByCategorie($categorie->getUid());
    $playlists = $this->playlistRepository->findByCategorie($categorie->getUid());
    //Merging arrays then sort it
    if ($videos && $playlists)
        $result = array_merge($videos, $playlists);
    else if ($videos)
        $result = $videos;
    else if ($playlists)
        $result = $playlists;
    if ($sort == "chrono")
        usort($result, array($this, "sortChrono"));
    else if ($sort == "antechrono" || $sort == null)
    {
        usort($result, array($this, "sortAnteChrono"));
        $sort="antechrono";
    }
    $this->view->assignMultiple(array('categorie' => $categorie, 'list' => $result, 'sort' => $sort));

Вот мое представление:

<f:widget.paginate objects="{list}" as="paginatedList" configuration="{addQueryString: 'true', addQueryStringMethod: 'GET,POST', itemsPerPage: 21}">
    <div class="videos row">
        <f:for each="{paginatedList}" as="element">
            <f:render partial="Show/ItemCat" arguments="{item: element}"/>
        </f:for>
    </div>
</f:widget.paginate>

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

Это прекрасно работает и показывает только элементы из запрошенной категории. К сожалению, у меня огромная проблема с производительностью: я попытался показать категорию, которая содержит более 3000 записей, и загрузка занимает около одной минуты. Это немного долго.

Посредством f: отладки моей переменной списка, я вижу, что она содержит все записи, даже через нее, не должно иметь место (в этом суть разбиения на страницы ...). Итак, первый вопрос: есть ли что-то неправильное в том, как я сделал свою нумерацию страниц?

Я попытался упростить свои запросы, включив функцию rawQuery ($ query-> execute (true)): я стал лучше производительность, но я не могу получить ссылку на изображения (на мой взгляд, я получаю 1 или 0, но не UID изображения ...). Второй вопрос: есть ли способ решить эту проблему?

Надеюсь, мое описание достаточно ясное. Спасибо за вашу помощь: -)

Ответы [ 2 ]

1 голос
/ 13 января 2020

Когда вы выполняете запрос, он фактически не будет извлекать данные из базы данных, пока не будут получены результаты. Если виджет paginate получает результат запроса, он добавляет к запросу ограничения и смещения, а затем извлекает данные из базы данных, поэтому вы будете получать только те записи, которые показаны на странице.

В вашем случае вы добавлено toArray() после execute(), которое осуществляет доступ к результатам, поэтому данные выбираются из базы данных, и вы получаете все записи. Лучшее решение, которое я могу придумать, - это объединить две таблицы в одну, чтобы вы могли сделать это с помощью одного запроса и не нужно объединять и упорядочивать их в PHP.

0 голосов
/ 13 января 2020

Пока вы сортируете данные после запроса, вы должны обрабатывать все данные (запрашивать все записи и особенно разрешать все отношения).

Попробуйте отсортировать данные в самом запросе (order by) Таким образом, вы можете ограничить данные только теми записями, которые необходимы для текущей страницы (limit <offset>,<number>).
Здесь сложный запрос с join и limit может быть быстрее, чем полный запрос и фильтрация в PHP.

...