理论水合过程中的分段错误-如何调试?

时间:2019-05-16 17:18:00

标签: doctrine-orm doctrine uuid

我正在运行一个控制台命令,该命令将提取一种类型的所有实体(并从中读取一些数据)。

$q = $this->em->createQuery(/** @lang DQL */'select u from App\Entity\DataSample u order by u.creationDate ASC');

两种迭代策略:

foreach ($q->getResult() as $d) {
} 

$iterableResult = $q->iterate();
foreach ($iterableResult as $onerow) {
    /* @var $d DataSample */
    $d = $onerow[0];

}

导致细分错误! 注意,我实际上在循环内什么也不做! 然后,第二个循环确实运行了数万次迭代和段错误,第一个循环在getResult()期间运行。 还有足够的可用内存,程序在使用大约200 MB内存时中断。 我的xdebug跟踪对我没有真正的帮助,其结束如下:

240.2365  489614864                                     -> str_pad() /var/www/rrr/vendor/ramsey/uuid/src/Codec/StringCodec.php:167
  240.2365  489614904                                   -> Ramsey\Uuid\Builder\DefaultUuidBuilder->build() /var/www/rrr/vendor/ramsey/uuid/src/Codec/StringCodec.php:84
  240.2365  489615000                                     -> Ramsey\Uuid\Uuid->__construct() /var/www/rrr/vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php:52
  240.2365  489614448                           -> Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateColumnInfo() /var/www/rrr/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:270
  240.2365  489614448                           -> Ramsey\Uuid\Doctrine\UuidType->convertToPHPValue() /var/www/rrr/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:315

我检查了对应表中的所有(ramsey / uuid)id,并且所有Uuid::isValid()都返回true

有趣的事实:当输出所有ID时,我发现它总是发生在同一DataSample!?

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个“解决方案”:

我插入了一次对$em->clear()的调用,并且每100次迭代插入了一个gc_collect_cycles调用,现在它终止了(实际上速度更快!)。

$i = 0;
$iterableResult = $q->iterate();
foreach ($iterableResult as $onerow) {
    /* @var $d DataSample */
    $d = $onerow[0];
    if($i % 100 === 0){
        $this->em->clear();
        gc_collect_cycles();
    }
    $i++;
}

但是很明显,这仅适用于iterableResult,理论上使用getResult应该也可以吗?