Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pagination 类型3:分页的性能问题_Pagination_Typo3_Typo3 9.x - Fatal编程技术网

Pagination 类型3:分页的性能问题

Pagination 类型3:分页的性能问题,pagination,typo3,typo3-9.x,Pagination,Typo3,Typo3 9.x,我目前正在基于我创建的扩展构建某种视频频道。它由视频和包含视频的播放列表组成。 我必须创建一个网页,其中包含一个视频列表和播放列表的类别。您还可以按日期对这些项目进行排序。最后,页面以无限滚动方式分页,该滚动方式应以21乘21加载项21。 为此,我在视频和播放列表存储库中创建了一个findByCategory函数,它非常简单: $query = $this->createQuery(); return $query->matching($query->equals('c

我目前正在基于我创建的扩展构建某种视频频道。它由视频和包含视频的播放列表组成。 我必须创建一个网页,其中包含一个视频列表和播放列表的类别。您还可以按日期对这些项目进行排序。最后,页面以无限滚动方式分页,该滚动方式应以21乘21加载项21。 为此,我在视频和播放列表存储库中创建了一个findByCategory函数,它非常简单:

$query = $this->createQuery();
    return $query->matching($query->equals('categorie.uid',$categoryUid))->execute()->toArray();
一旦我请求了我需要的项目,我就将它们合并到一个数组中并进行排序。以下是我的控制器显示操作:

    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:调试我的list变量,我发现它包含了所有记录,即使它不应该是这种情况,这是分页的重点。。。。所以第一个问题是:我分页的方式有什么问题吗

我试图通过启用rawQuery功能$query->executetrue来简化我的请求:我获得了更好的性能,但我无法获得视图中图片的链接,我得到了1或0,但图片的uid没有。。。。第二个问题:有没有办法解决这个问题


我希望我的描述足够清楚。感谢您的帮助:-

执行查询时,在访问结果之前,它实际上不会从数据库中获取数据。如果paginate小部件获得查询结果,它将向查询添加限制和偏移量,然后从数据库中获取数据,因此您将只获取页面上显示的记录


在您的例子中,您添加了一个array after execute,它访问结果,因此从数据库中获取数据并获得所有记录。我能想到的最好的解决方案是将两个表合并成一个表,这样您就可以用一个查询完成,而不必在PHP中对它们进行合并和排序。

只要在查询后对数据进行排序,您就必须处理所有数据请求所有记录,尤其是解决所有关系

尝试按顺序对查询本身中的数据进行排序,以便将数据限制为当前“页面”限制所需的记录,。
在这里,带有连接和限制的复杂查询可能比PHP中的完整查询和过滤更快。

因此,我理解,如果我必须以某种方式操作查询产生的数据,它将充当访问数据的角色,从而加载数据,并打破分页加载数据的方式。是吗?基本上是的。在用PHP操作数据之前,必须先获取数据,这样性能就会受到影响。