我有一个用Extbase编写的调度程序的导入作业,并且内存使用率确实很高。在TYPO3 7.6中,我可以使用
释放内存$this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class)->clearState();
但是升级到TYPO3 9.5后,“ clearState”似乎不像以前那样工作,此功能仅释放了少量内存。
我已经编写了一个简单的示例代码来演示该问题。该示例可以在Extbase控制器中运行,而无需在Scheduler上下文中运行。
var_dump(memory_get_usage());
$v1 = $this->frontendUserRepository->findAll();
foreach($v1 as $vv1) {
$a1 = $this->frontendUserRepository->findOneByUid($vv1->getUid());
}
var_dump(memory_get_usage());
$this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class)->clearState();
var_dump(memory_get_usage());
输出为int(49013528) int(565877768) int(543894472)
:通过“ findOneByUid”从数据库中检索用户会消耗大量内存,因为对象存储在某些PHP变量中,并且我希望释放此内存。在TYPO3 7中,它与功能“ clearState”一起使用。
persistAll()
处理的任何堆栈。如果要清除这样的堆栈,为什么要先写呢?也许我缺少该功能的含义,但至少通常它并没有真正删除很多数据。我可能会在扩展程序中使用该函数,如果事实证明某些条件将重置任何准备好的数据库操作,但这对于调度程序任务无济于事,并且应取决于特殊条件,而不是系统地完全删除堆栈。问题是要删除哪种缓存,here is a list of the cache-API。这里仍然提到Garbage Collection Task,也许正是您想要实现的。