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

Symfony6.3生产环境cache:clear遇Doctrine弃用警告后触发500错误

问题描述

将开发及生产服务器从Symfony 6.2升级至6.3后,生产环境执行缓存清理命令时出现以下弃用警告,虽命令返回清理成功,但所有请求均返回500 Internal Server Error,仅能通过手动删除缓存目录rm -rf /var/cache/prod/*后重新清理缓存解决:

$ php bin/console cache:clear --env=prod

 // Clearing the cache for the prod environment with debug false

[2023-06-16T09:05:26.482252+00:00] deprecation.INFO: User Deprecated: Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead {"exception":"[object] (ErrorException(code: 0): User Deprecated: Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead at /var/www/stuffin.fairmont.local/vendor/symfony/doctrine-bridge/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php:109)"} []
[2023-06-16T09:05:28.157486+00:00] deprecation.INFO: User Deprecated: Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead {"exception":"[object] (ErrorException(code: 0): User Deprecated: Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead at /var/www/stuffin.fairmont.local/vendor/symfony/doctrine-bridge/ContainerAwareEventManager.php:195)"} []
[2023-06-16T09:05:28.191619+00:00] deprecation.INFO: User Deprecated: Doctrine\DBAL\Platforms\AbstractPlatform::usesSequenceEmulatedIdentityColumns is deprecated. (AbstractPlatform.php:3945 called by ClassMetadataFactory.php:626, https://github.com/doctrine/dbal/pull/5513, package doctrine/dbal) {"exception":"[object] (ErrorException(code: 0): User Deprecated: Doctrine\\DBAL\\Platforms\\AbstractPlatform::usesSequenceEmulatedIdentityColumns is deprecated. (AbstractPlatform.php:3945 called by ClassMetadataFactory.php:626, https://github.com/doctrine/dbal/pull/5513, package doctrine/dbal) at /var/www/website.local/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php:209)"} []

 [OK] Cache for the "prod" environment (debug=false) was successfully cleared.

已对比开发环境(正常执行composer update)的vendor/symfony/doctrine-bundle、vendor/doctrine目录文件,手动删除生产环境中多余文件并确认依赖文件一致,但问题仍存在。附当前composer.json:

{
    "type": "project",
    "license": "proprietary",
    "minimum-stability": "stable",
    "prefer-stable": true,
    "require": {
        "php": ">=8.1",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "composer/package-versions-deprecated": "1.11.99.5",
        "doctrine/annotations": "^2.0",
        "doctrine/doctrine-bundle": "*",
        "doctrine/doctrine-migrations-bundle": "*",
        "doctrine/orm": "^2.15",
        "phpdocumentor/reflection-docblock": "^5.2",
        "stof/doctrine-extensions-bundle": "^1.5.0",
        "symfony/asset": "6.3.*",
        "symfony/console": "6.3.*",
        "symfony/dotenv": "6.3.*",
        "symfony/expression-language": "6.3.*",
        "symfony/flex": "^2",
        "symfony/form": "6.3.*",
        "symfony/framework-bundle": "6.3.*",
        "symfony/http-client": "6.3.*",
        "symfony/intl": "6.3.*",
        "symfony/mailer": "6.3.*",
        "symfony/mime": "6.3.*",
        "symfony/monolog-bundle": "^3.1",
        "symfony/notifier": "6.3.*",
        "symfony/password-hasher": "6.3.*",
        "symfony/process": "6.3.*",
        "symfony/property-access": "6.3.*",
        "symfony/property-info": "6.3.*",
        "symfony/proxy-manager-bridge": "6.3.*",
        "symfony/runtime": "6.3.*",
        "symfony/security-bundle": "6.3.*",
        "symfony/serializer": "6.3.*",
        "symfony/string": "6.3.*",
        "symfony/translation": "6.3.*",
        "symfony/twig-bundle": "6.3.*",
        "symfony/validator": "6.3.*",
        "symfony/web-link": "6.3.*",
        "symfony/webpack-encore-bundle": "^1.12",
        "symfony/yaml": "6.3.*",
        "twig/extra-bundle": "^2.12|^3.0",
        "twig/twig": "^2.12|^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "rector/rector": "^0.15.21",
        "symfony/browser-kit": "6.3.*",
        "symfony/css-selector": "6.3.*",
        "symfony/debug-bundle": "6.3.*",
        "symfony/maker-bundle": "^1.0",
        "symfony/phpunit-bridge": "^6.3",
        "symfony/stopwatch": "6.3.*",
        "symfony/var-dumper": "6.3.*",
        "symfony/web-profiler-bundle": "6.3.*"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": {
            "*": "dist"
        },
        "sort-packages": true,
        "allow-plugins": {
            "symfony/flex": true,
            "symfony/runtime": true
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },
    "replace": {
        "symfony/polyfill-ctype": "*",
        "symfony/polyfill-iconv": "*",
        "symfony/polyfill-php72": "*"
    },
    "scripts": {
        "auto-scripts": {
            "cache:clear": "symfony-cmd",
            "assets:install %PUBLIC_DIR%": "symfony-cmd"
        },
        "post-install-cmd": [
            "@auto-scripts"
        ],
        "post-update-cmd": [
            "@auto-scripts"
        ]
    },
    "conflict": {
        "symfony/symfony": "*"
    },
    "extra": {
        "symfony": {
            "allow-contrib": false,
            "require": "6.3.*"
        }
    }
}
排查与解决建议

1. 定位500错误具体原因

先聚焦找到500的根源,弃用警告不一定是直接诱因:

  • 临时修改.env.prod,设置APP_DEBUG=1,访问页面查看详细错误信息(注意用完改回,避免泄露敏感信息);
  • 查看web服务器错误日志(如Nginx的error.log、Apache的error_log),或者Symfony的var/log/prod.log,获取具体报错内容(比如类找不到、容器编译失败、权限问题等)。

2. 修复缓存权限问题

生产环境执行cache:clear的用户与web服务器用户不一致,会导致生成的缓存文件权限不正确,web进程无法读取:

  • 切换到web服务器用户执行缓存命令,比如sudo -u www-data php bin/console cache:clear --env=prod;
  • 分开执行清理与预热,避免权限问题:
    php bin/console cache:clear --env=prod --no-warmup
    php bin/console cache:warmup --env=prod
    
  • 清理后手动修正缓存目录权限:chown -R www-data:www-data var/cache/prod(根据实际web用户调整)。

3. 确保依赖安装完全一致

不要手动对比删除vendor文件,用Composer重新安装确保依赖完整:

  • 把开发环境的composer.lock同步到生产环境;
  • 在生产环境执行:
    composer install --no-dev --optimize-autoloader --classmap-authoritative
    
  • 执行后再清理缓存,避免依赖版本或文件缺失导致的问题。

4. 处理Doctrine弃用警告(潜在缓存生成隐患)

虽然警告本身不直接触发500,但缓存生成过程中的兼容性问题可能导致容器编译异常:

  • 替换Doctrine Subscribers为Listeners:检查项目中自定义的Doctrine Subscriber,或者stof/doctrine-extensions-bundle的配置,将Subscriber改为Listener(Symfony 6.3开始不再推荐将Subscriber注册为服务);
  • 升级Doctrine依赖:当前doctrine/orm为^2.15,可尝试升级到兼容Symfony 6.3的最新稳定版,比如^2.16,解决DBAL相关的弃用问题。

5. 排查缓存编译异常

尝试禁用缓存的优化选项,看是否是编译过程中的优化导致问题:

  • 在config/packages/prod/framework.yaml中临时注释或调整framework.cache的优化配置;
  • 执行缓存清理时添加--no-optimize参数:
    php bin/console cache:clear --env=prod --no-optimize
    
    如果此命令执行后500消失,说明是容器优化过程中出现兼容性问题,需要逐步排查自定义服务或Bundle的兼容性。

内容的提问来源于stack exchange,提问作者fearfelt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:37:01