启用sqlsrv驱动后Doctrine加载fixtures失败问题求助
问题原因
- 这是PHP 7.4 搭配 5.9.x 及部分低版本
sqlsrv/pdo_sqlsrv扩展的已知兼容问题:扩展注册的全局解析钩子会干扰PHP原生eval()函数的语法判断,当eval()执行的代码包含::(静态调用/常量访问)语法时,会误报「unexpected ':'」语法错误。 - 你使用的Doctrine Fixtures加载流程中,会通过
eval()执行内部生成的表达式代码,启用sqlsrv扩展后刚好触发了这个bug,和你业务代码本身没有关系。
可行解决办法
按优先级从高到低尝试:
- 升级sqlsrv扩展到兼容版本
执行以下命令安装PHP7.4适配的最新稳定版sqlsrv扩展:
安装完成后重启PHP-FPM/Apache即可,这个版本已经修复了eval语法解析冲突的问题。pecl install sqlsrv-5.10.1 pdo_sqlsrv-5.10.1 - 调整Doctrine连接配置,隔离驱动逻辑
如果无法升级扩展,在config/packages/doctrine.yaml中明确区分两个数据库连接的配置,避免Doctrine自动探测驱动时混用规则:
配置后清除缓存:doctrine: dbal: default_connection: mysql connections: mysql: driver: 'pdo_mysql' url: '%env(resolve:DATABASE_URL)%' options: !php/const PDO::ATTR_EMULATE_PREPARES: false mssql: driver: 'pdo_sqlsrv' url: '%env(resolve:MSSQL_DATABASE_URL)%'php bin/console cache:clear - 临时规避方案(仅用于本地开发调试)
加载fixtures前临时注释sqlsrv扩展,执行完成后再恢复,也可以写个脚本自动切换:# 禁用sqlsrv加载fixtures sed -i 's/extension=sqlsrv.so/;extension=sqlsrv.so/g' /etc/php/7.4/mods-available/sqlsrv.ini php bin/console doctrine:fixtures:load # 恢复扩展 sed -i 's/;extension=sqlsrv.so/extension=sqlsrv.so/g' /etc/php/7.4/mods-available/sqlsrv.ini
内容的提问来源于stack exchange,提问作者Alpha Kenny Buddy
相关产品推荐
相关产品推荐

