Doctrine的getRepository() - > findBy()的返回值超过了php中的内存

时间:2018-03-23 14:50:53

标签: php doctrine-orm doctrine-odm

我很难查看Doctrines findBy()方法的返回。

问题:

$res = $this->em->getRepository()->findBy(['deletedAt' => null], [], 10);

f($res);

正如您所看到的,我将结果限制为十,因此count($res)给出了10.此外,我从这里获取的表格只有大约20行!

现在,这是我常用于在Ajax请求中使用var_dump的f()函数。

function f($tx){    
    ob_clean();
    ob_start();
    echo "<pre>";
    var_dump($tx);
    echo "</pre>";
    $var = ob_get_clean();
    file_put_contents("d:/temp/f.html", $var, FILE_APPEND);    
}

由此产生的错误是:

[23-Mar-2018 14:43:25 UTC] PHP Fatal error: Out of memory (allocated 423624704) (tried to allocate 417349632 bytes) in D:\_webdev\rest-api-server\resources\config\default.php on line 8

其中line 8是函数f()中的var_dump()行。

我已经将php.ini中的内存限制增加到2GB。此外,每个请求(!)存在许多这样的错误行。在返回findBy()时,世界上到底发生了什么? doc of findBy()说:

Returns array The objects.

只有10行。消耗这么多空间是什么?数组中有哪些对象?

摘录表I的实体定义。

/**
 * @ORM\Column(type="integer", length=11)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\ManyToOne(targetEntity="\App\Entity\User")
 * @ORM\JoinColumn(name="author_id", referencedColumnName="id", onDelete="CASCADE")
 **/
protected $author;

/**
 * @ORM\ManyToMany(targetEntity="User")
 * @ORM\JoinTable(name="posts_attendees",
 *     joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
 * )
 **/
protected $attendees;

这些是大约十二列的三列。 ManyToMany关系可以导致这种情况吗?我不熟悉Doctrine Repositories。通常我会理解返回一组结果的查询,例如行。但是这里10行的结果消耗2 GB的数据。跆拳道。感觉每个人都包含所有用户(> 60k)或者其他东西;)为什么,在地球上?

编辑(临时解决方案)

由此推进了调试功能。不完全是我的意思,但至少它是有效的。

function f($tx, $doctrine = false){

        ob_clean();
        ob_start();
        echo "<pre>";
        if($doctrine) \Doctrine\Common\Util\Debug::dump($tx);
        else          var_dump($tx);
        echo "</pre>";
        $var = ob_get_clean();
        file_put_contents("d:/temp/f.html", $var, FILE_APPEND);

}

它告诉我,结果是一个长度为10的数组,每个数组都包含获取结果的对象。 ManyToMany关系的类型是itselft中的实体类。不知道为什么他们消耗2G。是时候学习教义......或者禁止它,我想。

0 个答案:

没有答案