问题描述
我有一个大型 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();
}