Php Symfony序列化程序的性能问题

Php Symfony序列化程序的性能问题,php,symfony,symfony4,Php,Symfony,Symfony4,关于本机Symfony序列化程序的性能问题,我需要一些帮助 如果我尝试像这样序列化实体数组: $serializedReservations = $this->serializer->serialize($reservations, 'json', ['groups' => 'reservationDetails', 'enable_max_depth' => true]); 序列化需要1秒以上的时间 另一方面,如果我这样做: $data = []; foreach (

关于本机Symfony序列化程序的性能问题,我需要一些帮助

如果我尝试像这样序列化实体数组:

$serializedReservations = $this->serializer->serialize($reservations, 'json', ['groups' => 'reservationDetails', 'enable_max_depth' => true]);
序列化需要1秒以上的时间

另一方面,如果我这样做:

$data = [];
foreach ($reservations as $reservation){
    $data['idreservation'] = $reservation->getIdreservation();
    $data['idcommand'] = $reservation->getCommand()->getIdCommand();
    $data['title'] =$reservation->getCommand()->getTitle();
    $data['serialnumber'] = $reservation->getStock()->getSerialNumber();
    $data['ubd'] = $reservation->getStock()->getUBD();
}

$serializedReservations = $this->serializer->serialize($data, 'json', ['groups' => 'reservationDetails', 'enable_max_depth' => true]);

序列化只需要21毫秒

因此,序列化数组当然要比序列化实体快,但为什么第一个方法在包含完全相同的数据时(reservationDetails组过滤我从数据[]中获得的相同的6个数据)如此缓慢


如果有人有想法或线索,我很感兴趣。如果我不能解决这个问题,我可能会尝试切换到JmsSerializer。

答案非常简单——它实际上并不包含相同的数据。实体包含更多的内容。它包含所有相关实体的延迟加载数据,并且可以从中访问。序列化时,您看不到它,因为它被简化为数组。但实体对象本身要大得多。为了避免性能下降,只需在存储库中编写自己的查询,它只获取数组中所需的数据。在第二种情况下,当我执行getStock()和getCommand()时,也会出现延迟加载,所以我看不出有什么大的区别。此外,Command和Stock不是集合,它们是多个一元关系,因此只应加载2个实体。我认为这并不能完全解释大时差的原因。编辑:如果序列化程序延迟加载关系不在序列化组中,则将其删除?但这听起来没用。是的,从逻辑上说不应该,但确实如此。这就是为什么我总是在我的存储库中使用自定义函数,所以我不会返回整个实体。我已经在我的存储库中使用了自定义函数,并且在这两个方法上使用了相同的函数。另外,我之前在另一个函数中已经在同一个实体上使用了getCommand()和getSock,因此该实体应该已经水合。我使用调试器进行了检查,在第一种情况下,只有Command和Stock实体是延迟加载的。答案非常简单-它实际上并不包含相同的数据。实体包含更多的内容。它包含所有相关实体的延迟加载数据,并且可以从中访问。序列化时,您看不到它,因为它被简化为数组。但实体对象本身要大得多。为了避免性能下降,只需在存储库中编写自己的查询,它只获取数组中所需的数据。在第二种情况下,当我执行getStock()和getCommand()时,也会出现延迟加载,所以我看不出有什么大的区别。此外,Command和Stock不是集合,它们是多个一元关系,因此只应加载2个实体。我认为这并不能完全解释大时差的原因。编辑:如果序列化程序延迟加载关系不在序列化组中,则将其删除?但这听起来没用。是的,从逻辑上说不应该,但确实如此。这就是为什么我总是在我的存储库中使用自定义函数,所以我不会返回整个实体。我已经在我的存储库中使用了自定义函数,并且在这两个方法上使用了相同的函数。另外,我之前在另一个函数中已经在同一个实体上使用了getCommand()和getSock,因此该实体应该已经水合。我使用调试器进行了检查,在第一种情况下,只有Command和Stock实体是延迟加载的。