先定位谁加的:composer show --tree | grep -i posix;再检查本地是否启用:php -m | grep -i posix;若仅开发用,移至require-dev;代码中调用前加function_exists判断;临时绕过用--ignore-platform-req=ext-posix,但不可提交至composer.lock或ci。

composer install 报 ext-posix missing 怎么办
这不是 Windows 或 macOS 的问题,是某个依赖(比如 symfony/console、phpunit/phpunit)在 require 里写了 ext-posix,而这个扩展在 Windows 上根本不存在、macOS CLI 默认也不启用。
先确认谁加的:composer show --tree | grep -i posix;再看本地是否真有:php -m | grep -i posix(Linux/macOS 可能需手动编译启用)。
- 如果只是开发用(如跑测试),把该包移到
require-dev更合理 - 代码中调用
posix_getpid()等函数前,加运行时判断:if (function_exists('posix_getpid')) { ... } - 临时绕过安装可用:
composer install --ignore-platform-req=ext-posix,但别写进 CI 脚本或提交到composer.lock
php -v 显示 8.2,但 composer install 还报 PHP 版本不满足
Composer 解析依赖时看的不是 Web 服务器的 PHP 版本,也不是 phpinfo() 里的版本,而是执行 composer install 命令时背后调用的 CLI PHP 二进制文件。
运行 which php(Linux/macOS)或 where php(Windows),再跟 php -v 对比——很可能你系统 PATH 里默认是 PHP 8.1,而项目要求 "php": "^8.2"。
- 显式指定高版本执行:
/usr/bin/php8.2 composer install(Linux/macOS)或"C:\php\php82\php.exe" composer install(Windows) - 别改
composer.json顶层"php": "^7.4"来“凑合”,这会让enum、readonly等语法在运行时报ParseError - CI 中必须确保
composer.lock是用目标 PHP 版本生成的,否则install阶段完全不读config.platform.php
composer check-platform-reqs 显示 ext-mbstring 缺失,但 php -m 里有
常见原因是 CLI 和 Web 使用了不同 php.ini,导致扩展虽已编译,但 CLI 模式下未启用。或者扩展名大小写/前缀不匹配(php -m 输出是 mbstring,但 Composer 认的是 ext-mbstring)。
运行 php --ini 看 CLI 加载的配置路径,再检查对应 php.ini 是否含 extension=mbstring(注意不是 extension=php_mbstring.dll,新版 PHP 已统一为无前缀)。
-
composer diagnose不校验扩展,只查基础连通性;真正管用的是composer check-platform-reqs - 某些扩展(如
ext-xml)依赖底层库(libxml2),Ubuntu/Debian 下需额外装php8.2-xml包,不只是php8.2-mbstring - Mac 用户用 Homebrew 安装 PHP 后,常漏掉
php82-ext-xml类似扩展包,得单独brew install php82-xml
config.platform 写了却没生效?
config.platform 只影响 composer update 时的依赖解析逻辑,对 composer install 完全无效——后者只照着 composer.lock 还原,根本不看你当前 config.platform 设了啥。
它必须严格嵌套在 composer.json 的 "config": {} 对象内,不能放顶层;扩展名必须带 ext- 前缀,且大小写、连字符要和 php -m 输出完全一致(ext-xdebug ✅,ext-xdebg ❌)。
- 改完
config.platform后,必须立刻运行composer update --lock,否则composer.lock仍是旧规则锁定的 - 项目根目录若存在
"repositories": []字段,会彻底屏蔽全局镜像配置,此时得进项目目录重配:composer config repo.packagist composer https://mirrors.aliyun.com/composer/ - CI 脚本里别依赖
--ignore-platform-reqs来“兜底”,那只是把问题延后到运行时爆Class not found或TypeError











