namelesscoder / asynchronous-reference-indexing
Requires
- typo3/cms-backend: ^8|^9
README
将参考索引更新委托给异步队列,由CLI / 调度程序处理
这是做什么的?
提供了一些东西
- 为DataHandler提供覆盖类,该类替换了一个方法
updateRefIndex
,导致即时索引被跳过,而是委托给队列。 - 为ReferenceIndex类提供类似的覆盖,以替换在DataHandler外部调用的方法,以捕获这些情况。
- 存储队列参考索引更新的SQL表。
- 一个可以通过CLI执行以处理队列中的参考索引而不会遇到超时或长时间等待问题的CommandController。
- 提供选项以排除表从参考索引中(仅在TYPO3 8.6+上)。请参阅扩展配置。
根据您的编辑器执行记录导入、复制、删除等操作的频率,这可以在一段时间内节省大量等待TYPO3后端响应的时间。
有关性能方面的更多信息,请参阅下面的“背景”部分。
安装
仅通过Packagist(或通过GitHub)提供。建议使用Composer进行安装。
composer require namelesscoder/asynchronous-reference-indexing
然后在TYPO3中启用扩展。这可以通过CLI命令完成
TYPO3_PATH_ROOT=$PWD/web vendor/bin/typo3 extensionmanager:extension:install asynchronous_reference_indexing
警告
未能更新参考索引在某些情况下可能会对您的网站产生负面影响,包括前端和后端。建议您为包含的命令控制器添加计划任务或cronjob,并将频率设置为非常低,例如每分钟一次。控制器维护一个锁文件,并防止并行执行,因此频繁运行是安全的。
请注意,此扩展始终捕获所有当前的参考索引,包括您可以使用现有(非Extbase)CLI命令或通过安装lowlevel
系统扩展时添加的“DB检查”后端模块触发的索引。使用这些方法中的任何一种强制更新参考索引将填充此扩展中包含的命令控制器的队列,以便在下次运行时处理所有现有记录,这些记录都有关系。
可能的副作用
延迟更新参考索引的一个主要副作用是:如果编辑器尝试删除尚未索引的关系的记录,则可能不会显示适当的警告。
次要副作用是记录之间的关系列表。此类信息仅在命令控制器运行时更新。
前端渲染不应受到负面影响。
用法
要从头重新索引网站,您通常会执行以下命令,如果您在sys_refindex表中有很多垃圾,您可能希望在执行之前截断它
TYPO3_PATH_ROOT=$PWD/web vendor/bin/typo3cms asyncreferenceindex:update --force 1
之后,您可以通过执行以下命令更新sys_refindex
TYPO3_PATH_ROOT=$PWD/web vendor/bin/typo3cms asyncreferenceindex:update
或者,您可以将计划任务设置为在特定间隔执行命令
背景
此社区扩展仅出于一个原因存在:在执行记录操作时增加TYPO3后端响应速度。由于TYPO3中ReferenceIndex类的内部结构,任何可能会更改引用的记录操作都会引起大量的SQL流量。
在撰写本文时(2016-12-04),问题可以描述如下
- 假设您使用
sys_category
关系针对10,000条不同记录(从任何表到一个sys_category
) - 更新、导入、删除或复制指向此
sys_category
的任何记录都会触发索引更新 - 索引更新本身会级联处理您编辑的每条记录所对应的10,000条
sys_category
记录 - 根据您编辑的记录数量,这可能导致数十万条SQL请求
已经做出了重大努力来提高引用索引的性能,然而,如果没有对整个引用索引逻辑进行完全重写,所有改进都不可避免地是微小的。再次强调,在撰写本文时,ReferenceIndex和RelationHandler类相互依赖,会递归调用对方,从而进一步加剧了上述性能问题。由于这些技术挑战非常难以克服,因此这个扩展被作为一个临时解决方案,通过减少90%的wall time来提高TYPO3中记录操作的响应速度。
您没有看错。 90% - 九零个百分点。
致谢
这项工作和所有前期调查都是由Systime资助的。Systime是一家丹麦在线出版公司,专门从事教育市场的“i-books”,并且他们特别面临着引用索引的严重问题。
参考文献
(性能配置文件未链接,因为它们不是永久在线的)