为什么Doctrine\ORM\Configuration的“DoctrineProxies”对象包含宇宙? [英] Why does Doctrine\ORM\Configuration's "DoctrineProxies" Object contain the Universe?

查看:166
本文介绍了为什么Doctrine\ORM\Configuration的“DoctrineProxies”对象包含宇宙?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  //实体类的一部分项目: 
/ ** @Column(name =product_id,type =integer)* /
private $ productId;

然后我执行了这个代码:

  // 3行〜直接从Doctrine配置获取EntityManager 
include'config / doctrine-config.php';
$ config = Setup :: createAnnotationMetadataConfiguration($ paths,$ isDevMode);
$ em = EntityManager :: create($ dbParams,$ config);

//我自己的代码来检索一个实体实例:
$ instance = $ em-> find(Item :: class,2);
print_r($ instance);

这是我得到的输出(跳过几个其他类似的属性):

  Application\Entity\Item对象

[id:Application\Entity\Item:private] => ; 2
[description:Application\Entity\Item:private] => Product Kit
[productId:Application\Entity\Item:private] => -1

请注意,从出来的上面有6(6)行, print_r()函数。



一切都很好,直到



接下来,我将 $ productId 列更改为 ManyToOne 关系在我的项目实体类,如下所示:

  / ** 
* @ManyToOne targetEntity =Product,inversedBy =id)
* @JoinColumn(name =product_id,referencedColumnName =id)
* /
private $ productId;

我运行的代码相同。





两百万,三百九十万六千行 em>行 print_r 输出。



查看打印输出我看到 DoctrineProxies\__CG__\Application\Entity\Product Object包含 2,392,564 print_r



问题:



这个对象是什么,为什么在打印出来时,占用近300Mb的磁盘空间是如此之大吗?



我不禁想知道这种复杂性是否会导致每天的性能问题码。例如,我没有在我的日常代码中打印出 $ instance 变量的内容,但是我肯定会返回方法调用。这是否意味着它是一个300Mb的变量,从 $ em-> find(Item :: class,2); 调用以上?



(非常)部分列表

 应用程序\Entity \Item对象

[id:Application\Entity\Item:private] => 2
[description:Application\Entity\Item:private] =>产品套件
[ProductId:Application\Entity\Item:private] => DoctrineProxies\__CG__\Application\Entity\Product对象

[__initializer__] => ; Closure Object

[静态] =>数组

[entityPersister] => Doctrine\ORM\Persisters\Entity\BasicEntityPersister Object

[class:protected] => Doctrine\ORM\Mapping\ClassMetadata Object

[name] => Application\Entity\Product
[namespace] =>应用ation\Entity
[rootEntityName] => Application\Entity\Product
[inheritanceType] => 1
[generatorType] => 5
[fieldMappings] => Array

[id] => Array

[fieldName] => id
[type] => integer
[scale ] => 0
[length] =>
[unique] =>
[nullable] =>
[precision] => 0
[columnName] => id
[id] => 1

[fieldNames] =>数组

[id] =&
[description] => description


[columnNames] => Array

[id] => id
[description] => description


[idGenerator] => Doctrine\ORM\Id\AssignedGenerator对象
[reflClass] => ReflectionClass对象

[name] => Application\Entity\产品


[namingStrategy:protected] => Doctrine\ORM\Mapping\DefaultNamingStrategy Object
[instantiator:Doctrine\ORM\Mapping\ClassMetadataInfo:private] => Doctrine\Instantiator\Instantiator Object



[conn:protected] => Doctrine\DBAL\Connection Object

[_conn:protected] => Doctrine\DBAL\Driver\PDOConnection Object



[_config:protected] => Doctrine\ORM\Configuration对象

[_attributes:protected] => Array

[metadataCacheImpl] => Doctrine\Common\Cache\ArrayCache Object

[data:Doctrine\Common\Cache\ArrayCache:private] => Array

[dc2_b1e855bc8c5c80316087e39e6c34bc26_ [Application\Entity\Item $ CLASSMETADATA] [1]] => Array

[0] => Doctrine\ORM\Mapping\ClassMetadata Object

[name] => Application\Entity\Item
[namespace] => Application\Entity
[rootEntityName] => Application\Entity\Item
[customGeneratorDefinition] =>
[customRepositoryClassName] =>
[isMappedSuperclass] =>
[isEmbeddedClass] =>
[parentClasses] =>数组

[BAZILLION LINES为了简洁而修改]


解决方案

不能使用XDebug或类似工具(限制转储对象大小)转储代理对象。



问题真的很简单:



代理 - >引用EntityManager - >引用UnitOfWork - >包含代理



这显然导致递归数据结构转储,这反过来又会导致一个混乱,任何时候你尝试转储没有明确的限制。


In my ORM code I have an Entity with a field fined like so:

//part of entity class Item:
/** @Column(name="product_id", type="integer") */
private $productId;

I then executed this code:

//3 lines ~straight out of Doctrine configuration to get EntityManager
include 'config/doctrine-config.php';
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$em = EntityManager::create($dbParams, $config);

//my own code to retrieve an entity instance:
$instance = $em->find(Item::class, 2);
print_r($instance);

And this is the output I get (skipping few other similar properties):

Application\Entity\Item Object
(
    [id:Application\Entity\Item:private] => 2
    [description:Application\Entity\Item:private] => Product Kit
    [productId:Application\Entity\Item:private] => -1
)

Note how there are 6 (six) lines above that came out of print_r() function.

And everything was fine, Until

Next, I have changed the $productId column to ManyToOne Relationship on my Item Entity class, like so:

/** 
 * @ManyToOne(targetEntity="Product", inversedBy="id")
 * @JoinColumn(name="product_id", referencedColumnName="id")
 */
private $productId;

I ran the same code.

OUT CAME THE UNIVERSE OF 2,392,600 LINES, WHAT?

Two million, three hundred and ninety two thousand, six hundred lines lines of print_r output.

looking at the print-out I see that DoctrineProxies\__CG__\Application\Entity\Product Object contains 2,392,564 lines printed by print_r

Question:

What is exactly in this object and why is it so big as to take up nearly 300Mb of disk space when printed out?

I cannot help but wonder if such complexity is apt to cause performance issues in every-day code. For example, I am not printing out the contents of the $instance variable in my every-day code, but I surely return the humongousness from a method call. Does that mean it is a 300Mb variable that gets passed from i.e. the $em->find(Item::class, 2); call above?

(Very) Partial Listing

Application\Entity\Item Object
(
 [id:Application\Entity\Item:private] => 2
 [description:Application\Entity\Item:private] => Product Kit
 [ProductId:Application\Entity\Item:private] => DoctrineProxies\__CG__\Application\Entity\Product Object
  (
   [__initializer__] => Closure Object
    (
     [static] => Array
      (
       [entityPersister] => Doctrine\ORM\Persisters\Entity\BasicEntityPersister Object
        (
         [class:protected] => Doctrine\ORM\Mapping\ClassMetadata Object
          (
           [name] => Application\Entity\Product
           [namespace] => Application\Entity
           [rootEntityName] => Application\Entity\Product
           [inheritanceType] => 1
           [generatorType] => 5
           [fieldMappings] => Array
            (
             [id] => Array
              (
               [fieldName] => id
               [type] => integer
               [scale] => 0
               [length] => 
               [unique] => 
               [nullable] => 
               [precision] => 0
               [columnName] => id
               [id] => 1
              )
           [fieldNames] => Array
            (
             [id] => id
             [description] => description
            )

       [columnNames] => Array
            (
             [id] => id
             [description] => description
            )

       [idGenerator] => Doctrine\ORM\Id\AssignedGenerator Object
           [reflClass] => ReflectionClass Object
            (
             [name] => Application\Entity\Product
            )

       [namingStrategy:protected] => Doctrine\ORM\Mapping\DefaultNamingStrategy Object
           [instantiator:Doctrine\ORM\Mapping\ClassMetadataInfo:private] => Doctrine\Instantiator\Instantiator Object

          )

     [conn:protected] => Doctrine\DBAL\Connection Object
          (
           [_conn:protected] => Doctrine\DBAL\Driver\PDOConnection Object
            (
            )

       [_config:protected] => Doctrine\ORM\Configuration Object
            (
             [_attributes:protected] => Array
              (
               [metadataCacheImpl] => Doctrine\Common\Cache\ArrayCache Object
                (
                 [data:Doctrine\Common\Cache\ArrayCache:private] => Array
                  (
                   [dc2_b1e855bc8c5c80316087e39e6c34bc26_[Application\Entity\Item$CLASSMETADATA][1]] => Array
                    (
                     [0] => Doctrine\ORM\Mapping\ClassMetadata Object
                      (
                       [name] => Application\Entity\Item
                       [namespace] => Application\Entity
                       [rootEntityName] => Application\Entity\Item
                       [customGeneratorDefinition] => 
                       [customRepositoryClassName] => 
                       [isMappedSuperclass] => 
                       [isEmbeddedClass] => 
                       [parentClasses] => Array

    [BAZILLION LINES redacted for brevity]

解决方案

You can't dump a proxy object without XDebug or similar tools (which limit the dumped object size).

The problem is really, really simple:

Proxy -> references EntityManager -> references UnitOfWork -> contains Proxy

This obviously leads to a recursive data-structure dump, which in turn leads to a mess any time you try to dump it without sensible limits.

这篇关于为什么Doctrine\ORM\Configuration的“DoctrineProxies”对象包含宇宙?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆