Composer 本身无架构问题,真正兼容性障碍在于 PHP 运行时、扩展及包中的 32 位二进制依赖;需验证 PHP 是否为 64 位(php -r "echo PHP_INT_SIZE === 8 ? '64-bit' : '32-bit';"),检查 platform 配置是否误导 Composer 加载错架构扩展,并确保 vendor/bin 调用的 PHP 与扩展架构一致。

Composer 在 64 位系统上基本没有原生兼容性问题——它本身是 PHP 脚本,不依赖 CPU 架构;真正出问题的,通常是 PHP 自身、扩展或你装的包里混进了 32 位二进制依赖。
PHP 运行时是否真为 64 位
很多人以为装了 64 位系统就自动有 64 位 PHP,其实不是。Windows 上常见 XAMPP/WAMP 默认带 32 位 PHP;macOS Homebrew 安装的 php 可能是 arm64 或 x86_64,但得确认;Linux 发行版包管理器(如 apt install php)也可能拉来 32 位构建(尤其在旧仓库中)。
验证方式很简单:
php -r "echo PHP_INT_SIZE === 8 ? '64-bit' : '32-bit';"
如果输出 32-bit,那 Composer 即使跑起来,也根本加载不了要求 int64 对齐或大内存操作的扩展(比如某些加密库、FFI 绑定)。
- Windows 用户优先用 windows.php.net 官方 64 位 Thread Safe ZIP 包,手动配
php.ini和环境变量 - macOS 用户用
brew install php后执行file $(which php)看是否含x86_64或arm64 - 别信控制台里
php -v的版本号,它不告诉你架构
composer.json 里写错 platform 导致装错扩展
你在 composer.json 里加过 "platform" 配置吗?比如为了在 CI 上绕过本地没装 ext-gd 就强行指定:
"platform": { "ext-gd": "8.1.0" }
这会欺骗 Composer:「我有 GD 扩展,版本 8.1.0」。但它不会检查这个 GD 是不是真的支持 64 位指针——而很多老旧的 GD 编译包(尤其是 Windows 上的第三方二进制)只提供 32 位 DLL,PHP 加载时报 PHP Warning: PHP Startup: Unable to load dynamic library 'gd',但 Composer 安装阶段完全看不到。
- 删掉
"platform"配置,让 Composer 真实探测环境 - 如果必须保留(如部署约束),确保对应扩展的 DLL/SO 文件是当前 PHP 架构匹配的版本(
php -m能列出才算数) - 特别注意
ext-igbinary、ext-msgpack、ext-redis这类带 C 扩展的包,它们的预编译包常分x86/x64两套
vendor/bin 下的可执行文件在 64 位系统启动失败
有些包(比如 phpunit/phpunit、laravel/pint)会在 vendor/bin 放一个 shell 脚本或 Windows 批处理,开头写着:
#!/usr/bin/env php
问题来了:如果你的系统 PATH 里有两个 PHP(比如 WAMP 的 32 位 PHP 和手动装的 64 位 PHP),而 env 找到的是前者,那哪怕 Composer 安装成功,运行 ./vendor/bin/phpunit 也会因扩展不兼容直接崩溃,报错类似:
PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen()
这不是函数不存在,是 ext-mbstring DLL 加载失败后被静默忽略,导致函数注册失败。
- 运行前先执行
which php和php -v,确认 CLI 使用的是你认为的那个 PHP - Windows 上避免用
.bat文件,改用php vendor/bin/phpunit显式调用 - Linux/macOS 可在
vendor/bin脚本头部把#!/usr/bin/env php换成绝对路径,比如#!/usr/local/bin/php
真正卡住人的从来不是 Composer 本身,而是它下游依赖的二进制扩展是否和你的 PHP 架构对得上——这点连 composer diagnose 都不报,得自己一层层查 php -m、php --ini、file $(php-config --extension-dir)/xxx.so。










