MAMP 自带 PHP 找不到 composer 命令,是因为终端未指向其私有 PHP 路径;应下载 composer.phar 并用包装脚本显式调用 MAMP 的 PHP 解释器,而非重装或盲目修改 PATH。

为什么 MAMP 自带的 PHP 找不到 composer 命令
MAMP 默认把 PHP 可执行文件藏在私有路径里(比如 /Applications/MAMP/bin/php/php8.2.12/bin/php),系统终端根本不知道它在哪,所以直接敲 composer 肯定报 command not found。这不是 Composer 没装好,是「路没指对」。
关键不是重装 Composer,而是让终端知道:你得用 MAMP 自己的 PHP 来跑 Composer,而不是系统或 Homebrew 的 PHP。
- 别用
curl -sS https://getcomposer.org/installer | php直接扔进/usr/local/bin—— 那会绑定到错误的 PHP 版本 - 别改
PATH把整个 MAMP 的bin加进去 —— 里面一堆同名命令(比如php、pear)可能冲突 - 最稳的方式:用 MAMP 的 PHP 解释器显式运行 Composer PHAR 文件
怎么让 composer 命令真正调用 MAMP 的 PHP
核心动作就一个:把官方下载的 composer.phar 放到安全位置,再写个 shell 包装脚本,强制指定 PHP 路径。
假设你用的是 MAMP Pro 6.8,PHP 版本是 8.2.12:
- 去
https://getcomposer.org/download/下最新composer.phar,保存到~/bin/composer.phar(自己建个~/bin目录,干净好管) - 创建可执行脚本
~/bin/composer,内容为:#!/bin/bash /Applications/MAMP/bin/php/php8.2.12/bin/php /Users/yourname/bin/composer.phar "$@"
- 运行
chmod +x ~/bin/composer - 把
~/bin加进PATH(写进~/.zshrc或~/.bash_profile):export PATH="$HOME/bin:$PATH"
之后终端重启,which composer 应该返回 /Users/yourname/bin/composer,composer --version 显示的 PHP 路径也会指向 MAMP。
composer install 报错 “Mcrypt extension is missing” 怎么办
这是老项目(尤其 Laravel 5.2 以前)常见问题 —— MAMP 4.0+ 默认不带 mcrypt,且 PHP 7.2+ 已彻底移除该扩展。硬启扩展不仅麻烦,还可能破坏 MAMP 环境稳定性。
- 别试著手动编译 mcrypt.so —— MAMP 的 PHP 是静态链接的,扩展机制和系统 PHP 不兼容
- 优先升级项目依赖:把
"laravel/framework": "5.2.*"换成支持 PHP 7.4+ 的版本,或改用openssl_encrypt替代 mcrypt - 如果必须跑旧代码,临时方案是降级 MAMP 到 3.5(含 PHP 5.6),但仅限本地调试,别用于新开发
顺带一提:composer diagnose 会检测扩展缺失,但它只是提醒,不影响大多数命令运行 —— 别被它的红字吓住。
为什么 composer update 在 MAMP 里特别慢甚至卡死
不是网络问题,大概率是 Composer 默认用了 HTTPS + DNS 查询 + 并行包解析,而 MAMP 自带的 PHP 编译时没开 openssl 或 curl 的完整支持(尤其证书路径不对)。
- 先确认
php -m | grep -E 'openssl|curl'有输出;没有?说明 MAMP 的 PHP 缺模块,别折腾 Composer,换版本更省时间 - 临时提速:加
--prefer-dist强制走压缩包而非 Git 克隆,避免 SSH/Git 协议卡住 - 永久解决:在
~/.composer/config.json里加"github-protocols": ["https"],绕过 SSH 认证环节 - 别信“改 hosts 绑定 github.com IP” —— Composer 用的是 PHP 的 stream context,不走系统 hosts
真正卡住的时候,Ctrl+C 中断后看最后一行 URL,大概率是某个包的 dist ZIP 下载地址 404 或跳转异常 —— 这时候要查 composer show vendor/package 看真实源地址,而不是盲目清缓存。










