【发布时间】:2016-06-03 15:43:23
【问题描述】:
我在 PHP 中遇到了一个奇怪的“错误”,由于我是新手,所以我的知识已经走到了尽头。
我正在开发一个 TYPO3 扩展程序,该扩展程序在数据方面存在一些重大性能问题,至少我是这么认为的。 事实证明,存储我从数据库查询中获得的所有对象的数组的第一次使用需要很长时间。 之后的每次使用或循环都会再次快速。
代码如下所示:
$productsArr = $this->productRepository->findByDetail($category, $properties);
$newSortArr = array();
$familyProductList = array();
$counter = count($productsArr);
/** @var Product $product */
for($i = 0; $i < $counter; $i++) {
//it takes to long to do this
$product = $productsArr[$i];
if(!empty($productsArr[$i])) {
$newSortArr[$product->getInFamily()->getUid()][] = $product;
}
}
我第一次在哪里使用对象数组并不重要。数组的第一次使用总是需要大约 30 秒。
有没有人遇到过类似的情况? 如果您需要更多信息,我很乐意提供。
提前致谢!
【问题讨论】:
-
可能是查询“重”,第一次使用后仍然在您的数据库服务器的查询缓存中,因此您下次得到更快的响应。
-
我不熟悉 TYPO3,但翻译成 Symfony/Doctrine 术语,您似乎可以从数据库中获取产品列表,然后访问循环内的某些关系 (
getInFamily)。这可能意味着您延迟加载此数据 - 意味着您正在为循环中的每个产品启动另一个数据库查询。计算运行的查询,或跳过$newSortArr行,看看循环是否运行得更快而不这样做。两者都表明可能是这种情况。通常通过加入关联关系来解决,因此它被添加到结果集中而不是使用延迟加载来获取。 -
@MarcB 但查询执行得非常快。只有第一次使用数组,比如当我将它分配给另一个变量时需要 long
-
@JimL getInFamily 请求并没有破坏它。 if ( $product = $productsArr[$i]; ) 上面的部分需要很长时间。在该行之前,第一次使用 $productsArr 是在 if 中,这也花费了很长时间。
标签: php sql arrays typo3 extbase