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 4 在 Windows 上非常慢

Symfony 缓存:清除错误毁了我的整个项目

Symfony 2.7 / 3 - Doctrine:您请求了一个不存在的服务“fos_user.doctrine_registry”

Symfony 3.2.7 和奏鸣曲媒体包安装

在 Django 中将 cache.clear() 添加到全局保存

运行composer install时出错执行\"'cache:clear --no-warmup'\"命令时出错: