macOS 12.4使用PECL安装PHP7.4扩展失败的解决方案咨询
macOS 12+ Homebrew 部署PHP环境PECL扩展安装失败修复方案
两个核心报错的根本原因:
phpize运行失败提示找不到config.m4:Homebrew源的PECL存在路径解析bug,执行pecl install时不会自动进入解压后的扩展源码根目录执行构建命令- 编译阶段提示找不到BZip2等已安装的依赖:macOS 12之后系统安全策略限制了编译期的默认搜索路径,加上ARM版Mac的Homebrew安装路径为
/opt/homebrew(Intel版为/usr/local),扩展的configure脚本默认不会主动扫描Homebrew的依赖安装目录,该逻辑和shell的PATH配置没有关系,因此哪怕依赖已经安装、PATH配置正确也会识别失败。
前置准备
先把基础编译环境和依赖装齐:
# 安装Xcode命令行编译工具,未安装的话所有编译操作都会失败 xcode-select --install # 安装常用编译依赖包 brew install bzip2 zlib libpng openssl@1.1 autoconf pkg-config # 验证当前默认PHP为Homebrew安装的php@7.4版本,避免调用系统自带的裁剪版PHP which php # ARM Mac正常输出:/opt/homebrew/opt/php@7.4/bin/php # Intel Mac正常输出:/usr/local/opt/php@7.4/bin/php
修复PECL全局配置,解决路径识别错误问题:
# 自动获取Homebrew安装前缀,兼容ARM/Intel架构,无需手动修改 BREW_PREFIX=$(brew --prefix) # 给PECL指定对应版本PHP的二进制、配置文件路径 pecl config-set bin_dir "${BREW_PREFIX}/opt/php@7.4/bin" pecl config-set php_ini "${BREW_PREFIX}/etc/php/7.4/php.ini"
通用扩展安装流程(适配所有PECL扩展)
不要直接执行pecl install 扩展名,手动分步构建,显式传入依赖路径即可解决所有识别问题,以bz2扩展为例:
- 下载并解压扩展源码
pecl download bz2 # 解压下载完成的tgz压缩包,注意替换成实际下载的文件名 tar -zxvf bz2-*.tgz # 进入解压后的源码目录 cd bz2-*/ - 执行phpize生成构建配置脚本
执行成功会输出PHP版本、API版本信息,不会再出现找不到config.m4的报错。${BREW_PREFIX}/opt/php@7.4/bin/phpize - 配置编译参数,显式指定依赖路径
先设置全局编译 Flags,让编译器能找到Homebrew安装的库和头文件:
执行configure,指定php-config路径和对应依赖的路径:export CPPFLAGS="-I${BREW_PREFIX}/include" export LDFLAGS="-L${BREW_PREFIX}/lib"./configure \ --with-php-config=${BREW_PREFIX}/opt/php@7.4/bin/php-config \ --with-bz2=${BREW_PREFIX}/opt/bzip2其他扩展只需要替换对应依赖的参数即可:例如安装zip扩展追加
--with-libzip=${BREW_PREFIX}/opt/libzip,安装gd扩展追加--with-png-dir=${BREW_PREFIX}/opt/libpng --with-zlib-dir=${BREW_PREFIX}/opt/zlib,所有Homebrew安装的依赖都存放在${BREW_PREFIX}/opt/目录下,遇到找不到依赖的报错时,把对应依赖的安装路径传给configure的--with-xxx参数即可。 - 编译并安装扩展
# 按CPU核心数并行编译,速度更快 make -j$(sysctl -n hw.ncpu) make install - 启用扩展
编译安装完成后,在php.ini文件中追加扩展引入配置:
执行extension=bz2.sophp -m查看已加载扩展列表,能看到对应扩展名即安装成功,重启php-fpm、Nginx/Apache等服务后生效。
注意事项
- 所有操作不要加
sudo,Homebrew目录权限归属当前用户,加sudo会打乱目录权限导致后续写入、编译失败 - 不要使用macOS系统自带的PHP,该版本经过苹果裁剪,缺失完整的头文件,编译扩展大概率报错
- 如果后续安装其他扩展时出现头文件、库文件找不到的报错,先确认已经执行过前面设置
CPPFLAGS和LDFLAGS的命令,再把对应依赖的路径传给configure参数即可。
内容的提问来源于stack exchange,提问作者Damian Tran
相关产品推荐
相关产品推荐

