我很难查看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。是时候学习教义......或者禁止它,我想。