我有 53 个表,其中很多表通过关系相互引用。当我运行时:
php app/console doctrine:schema:create
我得到错误最大嵌套级别达到 100。通过研究,我发现这实际上是xdebug阻止无限循环的安全措施。当我删除此限制并再次运行命令时,php cli 停止工作并强制关闭它。
无论如何,可以通过构建数据库结构等步骤生成架构,然后返回并添加映射和索引,以免失败?
还是我做错了别的事情?
MySQL确实有效,我可以使用相同的方法创建具有较少表/关系的模式。
更新:原则:模式:创建 --dump-sql 也挂起。最大嵌套级别和最大执行时间都设置为无限制。仍然 PHP CLI 停止工作:
Problem signature:
Problem Event Name: APPCRASH
Application Name: php.exe
Application Version: 5.3.26.0
Application Timestamp: 51af706d
Fault Module Name: ntdll.dll
Fault Module Version: 6.1.7601.17725
Fault Module Timestamp: 4ec49b8f
Exception Code: c00000fd
Exception Offset: 0002e8fb
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1033
Additional Information 1: 8983
Additional Information 2: 898375922a25a99ebc5721487ed92891
Additional Information 3: f337
Additional Information 4: f3378ae3d6023e7f336317eca89ba0b7
你必须在 php 中增加 xdebug.max_nesting_level
的值(默认为 100 .ini以避免maximum nesting level of 100 reached
错误。
您很可能会多次遇到此问题,例如在缓存预热期间 - 不仅在尝试创建数据库架构时。因此,增加所有symfony开发的价值 - magento和zf也是如此......
还要检查max_execution_time
设置,如果命令似乎挂起,可以使用探查器 (xdebug/xhprof( 进行检查。创建架构可能需要一些时间,请耐心等待:)
doctrine:schema:create
命令没有用于"拆分"操作的选项。
尝试doctrine:schema:create --dump-sql
是否也挂起。
一个非常肮脏的解决方法:
您可以定义新的内核环境(即step1,step2(,创建不同的映射(越来越详细(或在第一个"步骤"/环境中仅手动配置其中的几个,在config_stepx.yml中注册/覆盖它们并使用类似的东西
doctrine:schema:create --env=step1
doctrine:schema:update --env=step2
...
。但这真的是一团糟。
根据我的经验,该命令甚至应该适用于大型数据集。 我已经为具有>100 个表的应用程序创建了架构,没有任何问题。
答案是我的实体在用作主键的同一键上具有一对一的自我引用关系。从而在创建过程中创建一个无限循环。
不太确定为什么它首先存在,其中一些是由学说数据库逆向工程命令生成的。