答案是:先运行which php和php --ini确认PHP来源,若为/usr/bin/php或配置文件路径不含homebrew/MAMP则为系统自带,需切换至brew或MAMP的PHP路径。

确认当前 PHP 是 brew 还是系统自带的
Mac M1 上装 Swoole 最常见的失败根源,就是终端里 php 命令调用的是系统自带 PHP(路径 /usr/bin/php),它没有 phpize、不带开发头文件、也不能跑 pecl。运行 which php,如果输出 /usr/bin/php,立刻停手——这条路走不通。
正确路径应含 /opt/homebrew/(Apple Silicon)或 /usr/local/(Intel),MAMP 用户则应是 /Applications/MAMP/bin/php/phpX.X.X/bin/。再执行 php --ini 看 Loaded Configuration File,路径里有 homebrew 或 MAMP 才算靠谱;如果是 /etc/php.ini 或空白,基本就是系统 PHP 在冒充。
- 切到 brew PHP:确保已执行
brew install php,检查which php是否为/opt/homebrew/bin/php - 切到 MAMP:在
~/.zshrc加export PATH="/Applications/MAMP/bin/php/php8.2.12/bin:$PATH"(版本号按你实际路径改) - 别碰系统 PHP:macOS Sonoma 及以后彻底禁写
/usr下任何内容,强行卸载或 patch 会触发 SIP 报错且无必要
pecl install swoole 报 pcre2.h not found
这是 PHP 8.2+(尤其是 brew 的 php@8.2)在 M1 上的高频报错:/opt/homebrew/Cellar/php@8.2/8.2.15/include/php/ext/pcre/php_pcre.h:23:10: fatal error: 'pcre2.h' file not found。根本原因是 brew 安装的 PHP 依赖 PCRE2,但头文件没被正确暴露给编译器。
临时解法是改用源码编译,但更稳的路径是先修复 PCRE2 环境:
立即学习“PHP免费学习笔记(深入)”;
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 确认已装
pcre2:brew install pcre2 - 导环境变量:
export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig" - 重试
pecl install swoole;若仍失败,就跳过 pecl,直接源码编译
源码编译时 configure 找不到 OpenSSL 或 iconv
M1 芯片默认用 LibreSSL,而 Swoole 编译强制需要 OpenSSL(不是 LibreSSL)。configure: error: Cannot find OpenSSL's <evp.h> 或 configure: error: Please reinstall the iconv library 都指向同一问题:头文件路径不对或库本身是 x86_64 架构。
必须用 arm64 编译的 OpenSSL 和 libiconv:
- 装 arm64 OpenSSL:
brew install openssl@3(不是openssl@1.1),然后导export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"和export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include" - 装 arm64 libiconv:
brew install libiconv,configure 时显式指定--with-iconv=/opt/homebrew/opt/libiconv - php-config 路径必须绝对准确:
./configure --with-php-config=/opt/homebrew/bin/php-config(不能只写php-config)
make install 后 extension 不生效
即使 make install 成功输出 Installing shared extensions: /opt/homebrew/lib/php/20220829/,swoole.so 也不会自动加载。PHP 不会猜路径,必须手动告诉它。
关键点在于:扩展路径和 php.ini 必须严格匹配当前 PHP 实例:
- 查扩展目录:
php -r "echo ini_get('extension_dir');" - 查 php.ini 位置:
php --ini输出的Loaded Configuration File - 编辑对应
php.ini,加一行:extension=swoole(不是swoole.so,新版 Swoole 支持短名) - 验证:
php -m | grep swoole;如果没输出,说明要么路径错、要么 ini 文件没 reload、要么 extension_dir 里根本没生成swoole.so
多版本 PHP 共存时,最容易漏掉的是:你以为改了 /usr/local/etc/php/8.2/php.ini,但实际 php --ini 加载的是 /opt/homebrew/etc/php/8.2/php.ini ——路径差一个字母就白忙活。


















