ddev环境安装Symfony5.4.9报Composer平台版本检测错误求助
问题背景
在本地ddev环境安装Symfony 5.4.9后运行,先后触发两类报错:
- 首次运行的致命错误:
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.4.29. in /var/www/html/symfony/vendor/composer/platform_check.php on line 24
- 执行
composer install --ignore-platform-reqs绕过平台检测后,出现解析报错:
Parse error: syntax error, unexpected '|', expecting variable (T_VARIABLE) in /var/www/html/symfony/vendor/psr/log/src/LoggerInterface.php on line 30
本地主机命令行执行php -v查询,显示CLI端PHP版本为8.1.6:
❯ php -v PHP 8.1.6 (cli) (built: May 12 2022 23:44:22) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.6, Copyright (c) Zend Technologies with Zend OPcache v8.1.6, Copyright (c), by Zend Technologies
项目composer.json中声明的PHP版本要求为>=7.2.5,相关配置片段如下:
"type": "project", "license": "proprietary", "minimum-stability": "stable", "prefer-stable": true, "require": { "php": ">=7.2.5", "ext-ctype": "*", "ext-iconv": "*", "symfony/console": "*", "symfony/dotenv": "*", "symfony/flex": "^1.17|^2", "symfony/framework-bundle": "*", "symfony/runtime": "*", "symfony/yaml": "*" }, "require-dev": { }, "config": {
故障原因
- 本地主机CLI的PHP环境和ddev容器内的Web运行环境是相互独立的:本地主机PHP版本为8.1.6,但ddev容器默认配置下Web服务使用PHP 7.4.29,浏览器访问项目走容器内PHP环境,因此触发版本不兼容报错。
- 加
--ignore-platform-reqs参数安装依赖时,Composer会跳过PHP版本校验,拉取最新版依赖包。其中psr/log3.x版本使用了PHP 8.0才支持的联合类型语法(即报错中提到的|符号),PHP 7.4无法解析该语法,因此抛出解析错误。 composer.json中多个Symfony组件的版本约束使用通配符*,即使声明了PHP >=7.2.5,Composer仍会优先拉取最新版组件,这类新版组件多数要求PHP 8.1+,和容器内低版本PHP不兼容。
解决方法
使用ddev/docker部署环境时,需要在项目根目录的config.yml中明确配置容器内PHP版本,保证版本和Symfony依赖要求匹配,参考配置如下:
name: ddev-gitpod type: drupal9 docroot: web php_version: "8.1" webserver_type: nginx-fpm router_http_port: "80" router_https_port: "443" xdebug_enabled: false additional_hostnames: [] additional_fqdns: [] database: type: mariadb version: "10.3" nfs_mount_enabled: false mutagen_enabled: false use_dns_when_possible: true composer_version: "" web_environment: [] nodejs_version: "16"
配置修改完成后按以下步骤操作:
- 执行
ddev restart重启容器,让新的PHP版本配置生效 - 删除之前错误安装生成的依赖目录:
ddev exec rm -rf vendor - 执行
ddev composer install重新安装依赖,不要加--ignore-platform-reqs参数 - 依赖安装完成后即可正常访问项目
注意:ddev环境下不要直接在本地主机执行composer命令安装依赖,必须加
ddev前缀调用容器内的composer,保证安装依赖时使用容器内的PHP版本,避免出现版本不匹配问题。
内容的提问来源于stack exchange,提问作者balrcoding
相关产品推荐
相关产品推荐

