后端页面复制速度非常慢

问题描述

我有一个大型 TYPO3 8.7.39 安装,大约有 2500 页和 30 种不同的语言。

当我尝试在后端复制页面(用作登录页面模板)时,在我的本地机器上完成操作大约需要 5 分钟。该页面包含 130 个内容元素(包括自己编写的扩展和扩展网格元素),这些元素引用了多个图像。

当我记录在复制操作期间执行的所有数据库查询时,我得到大约 8000 个查询。由于每 5 分钟 8000 db 操作降低到每 0.04 秒大约 1 db 操作,因此复制页面所需的时间似乎是合理的。

我的问题:是否有任何选项可以加快页面复制速度?也许至少可以通过 cli 或调度程序任务复制页面,这将是一种解决方法。

系统信息:

  • TYPO3 8.7.39
  • 运行 Ubuntu 18.04
  • 数据库结构是最新的
  • #pages ~ 2500,#num_languages = 30,#num_fe_users ~ 80

解决方法

我可以通过创建一个命令控制器来解决这个问题,该控制器使用数据处理程序将源页面复制到目标页面。

/**
 * @param int $src
 * @param int $target
 */
public function copyCommand(int $src,int $target): void
{
    /** @var PageRepository $pageRepository */
    $pageRepository = GeneralUtility::makeInstance(PageRepository::class);
    $srcPage = $pageRepository->getPage($src);

    if (empty($srcPage)) {
        throw new InvalidArgument("$src ist not a valid page uid");
    }

    if (empty($pageRepository->getPage($target))) {
        throw new InvalidArgument("$target ist not a valid page uid");
    }


    $cmd = [
        'pages' => [
            $src => [
                'copy' => [
                    'action' => 'paste','target' => $target,'update' => [
                        'title' => sprintf("Copy of #%d: %s",$src,$srcPage['title']),'hidden' => 1,]
                ]
            ]
        ]
    ];
    /** @var DataHandler $dataHandler */
    $dataHandler = GeneralUtility::makeInstance(DataHandler::class);

    $dataHandler->start([],$cmd);
    $dataHandler->process_cmdmap();

}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...