应将 boris 降级至 v1.0.8,因其是最后一个不强制要求 pcntl 扩展的稳定版,兼容 laravel 4.2 且支持 artisan tinker;需修改 composer.json 中依赖为 "d11wtq/boris": "1.0.8" 并执行 composer update d11wtq/boris。

d11wtq/boris v1.0.10 requires ext-pcntl 这个报错不是 Laravel 4.2 本身的问题,而是它依赖的 boris REPL 工具版本与当前 PHP 环境不匹配 —— 特别是 M 芯片 Mac 上默认 PHP 不带 pcntl 扩展,且 boris v1.0.10 强制要求该扩展。
为什么 composer install 会卡在 d11wtq/boris
Laravel 4.2 的 composer.json 中 dev-dependencies 默认包含 "d11wtq/boris": "~1.0"。Composer 解析时会取满足条件的最新版,即 v1.0.10,而这个版本加了 "ext-pcntl": "*" 的硬性要求。但 macOS(尤其是 M 芯片)自带 PHP 或 Homebrew 安装的 PHP 通常不编译 pcntl(PHP-FPM 模式下也用不到),导致安装直接失败。
- 这不是 PHP 版本太低,也不是 Composer 配置问题,而是依赖树里一个开发工具的版本策略过于激进
- 你不需要
boris来运行 Laravel 4.2 应用,它只在 artisan tinker 命令里用到,而 4.2 的 tinker 实际上并不强依赖它 - 强行启用
pcntl在 macOS 上非常麻烦(需重编译 PHP),完全没必要
直接降级 boris 到 v1.0.8
v1.0.8 是最后一个不要求 pcntl 的稳定版,兼容性好,且能被 Laravel 4.2 正常调用。操作只需两步:
- 修改项目根目录下的
composer.json,把"d11wtq/boris": "~1.0"改成"d11wtq/boris": "1.0.8" - 运行
composer update d11wtq/boris(不要用install,避免重装其他包)
如果之前已报错中断,先删掉 vendor/ 和 composer.lock,再执行上面命令。成功后 php artisan tinker 仍可使用(底层会 fallback 到 PHP 内置 readline)。
M 芯片 Mac 上还要注意终端架构一致性
哪怕降级了 boris,如果你的终端是 Rosetta 模式(uname -m 输出 x86_64),而 Homebrew 安装的是 arm64 版 PHP,就可能出现扩展加载路径错乱、libphp.dylib 找不到等隐性问题。
- 检查当前 Shell 架构:
uname -m,必须是arm64 - 确认 Homebrew 是原生安装:
which brew应返回/opt/homebrew/bin/brew - 确保
php命令来自/opt/homebrew/bin/php,而不是/usr/bin/php或 Rosetta 下的/usr/local/bin/php
这些细节不直接影响 boris 降级,但一旦后续要装 swoole 或其他 C 扩展,就会立刻暴露出来 —— 很多人以为是扩展本身不兼容,其实是编译环境和运行环境架构错位。











