Symfony 2.7 cache:clear 命令检查每个数据库连接
Posted
技术标签:
【中文标题】Symfony 2.7 cache:clear 命令检查每个数据库连接【英文标题】:Symfony 2.7 cache:clear command checks every database connection 【发布时间】:2016-03-05 13:50:54 【问题描述】:我刚刚升级到 symfony 2.7,并且有一个烦人的行为。
我的 config.yml 中的一些连接是可选的,并且描述了不打算在每个 prod 实例中使用的外部数据库。
执行 cache:clear 时,似乎现在每个连接都被检查,即使我不希望它们在特定服务器上处于活动状态。
设置 --no-warmup 选项时,问题出现一半
php app/console cache:clear --env=prod --no-warmup --verbose
[Doctrine\DBAL\Exception\ConnectionException] 驱动程序中发生异常:SQLSTATE[42000] [1049] 未知 数据库 'bal_syncrho_database'
异常跟踪:() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractmysqlDriver.php:103 Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:133 Doctrine\DBAL\DBALException::driverException() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php:47 Doctrine\DBAL\Driver\PDOMySql\Driver->connect() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:360 Doctrine\DBAL\Connection->connect() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:429 Doctrine\DBAL\Connection->getDatabasePlatformVersion() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:389 Doctrine\DBAL\Connection->detectDatabasePlatform() 在 /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:328 Doctrine\DBAL\Connection->getDatabasePlatform() 在 /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:763 Doctrine\ORM\Mapping\ClassMetadataFactory->getTargetPlatform() 在 /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:616 Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping() 在 /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:174 Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata() at /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:332 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata() 在 /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:78 Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata() at /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:216 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor() 在 /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:115 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata() 在 /var/www/ror3/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php:69 Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp() 在 /var/www/ror3/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php:48 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp() 在 /var/www/ror3/app/bootstrap.php.cache:2641 Symfony\Component\HttpKernel\Kernel->initializeContainer() 在 /var/www/ror3/app/bootstrap.php.cache:2411 Symfony\Component\HttpKernel\Kernel->boot() 在 /var/www/ror3/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:70 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() 在 /var/www/ror3/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:120 Symfony\Component\Console\Application->run() at /var/www/ror3/app/console:27
【问题讨论】:
【参考方案1】:Doctrine 正在尝试确定数据库平台版本。
您可以在服务器版本中添加Doctrine DBAL Configuration 来避免这种行为。来自文档:
在 Doctrine DBAL 2.5 中添加了 server_version 选项,即 DoctrineBundle 1.3 使用。此选项的值应与您的 数据库服务器版本(使用 postgres -V 或 psql -V 命令查找 你的 PostgreSQL 版本和 mysql -V 来获取你的 MySQL 版本)。
如果你没有定义这个选项并且你还没有创建你的数据库,你可能会得到 PDOException 错误,因为 Doctrine 会 尝试自动猜测数据库服务器版本,但没有 可用。
例如:
#config.yml
doctrine:
dbal:
...
server_version: 5.6
希望有帮助
【讨论】:
以上是关于Symfony 2.7 cache:clear 命令检查每个数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 2.7 / 3 - Doctrine:您请求了一个不存在的服务“fos_user.doctrine_registry”