You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用sqlsrv驱动后Doctrine加载fixtures失败问题求助

问题原因

  • 这是PHP 7.4 搭配 5.9.x 及部分低版本sqlsrv/pdo_sqlsrv扩展的已知兼容问题:扩展注册的全局解析钩子会干扰PHP原生eval()函数的语法判断,当eval()执行的代码包含::(静态调用/常量访问)语法时,会误报「unexpected ':'」语法错误。
  • 你使用的Doctrine Fixtures加载流程中,会通过eval()执行内部生成的表达式代码,启用sqlsrv扩展后刚好触发了这个bug,和你业务代码本身没有关系。

可行解决办法

按优先级从高到低尝试:

  1. 升级sqlsrv扩展到兼容版本
    执行以下命令安装PHP7.4适配的最新稳定版sqlsrv扩展:
    pecl install sqlsrv-5.10.1 pdo_sqlsrv-5.10.1
    
    安装完成后重启PHP-FPM/Apache即可,这个版本已经修复了eval语法解析冲突的问题。
  2. 调整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
  3. 临时规避方案(仅用于本地开发调试)
    加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:15:04