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参数:
如果此命令执行后500消失,说明是容器优化过程中出现兼容性问题,需要逐步排查自定义服务或Bundle的兼容性。php bin/console cache:clear --env=prod --no-optimize
内容的提问来源于stack exchange,提问作者fearfelt
相关产品推荐
相关产品推荐

