XAMPP 中部署 Swoole 应用需先正确加载 swoole.so(或 php_swoole.dll),再独立启动服务;Apache 无法托管 Swoole,必须用 CLI 运行脚本并验证 CLI 与 Web 环境双加载。

在 XAMPP 中部署基于 Swoole 的 PHP 应用,本质是两件事:先让 swoole.so(Linux/macOS)或 php_swoole.dll(Windows)被 PHP 正确加载,再让应用脱离 Apache/Nginx 独立运行。XAMPP 自带的 Apache 无法处理 Swoole 启动的协程服务,这点必须提前认清。
确认 XAMPP 的 PHP 版本、架构与线程模型
这是所有后续操作的前提,错一个就白忙活。XAMPP 不同版本打包的 PHP 构建差异很大,尤其 macOS 上 M1/M2 用户容易栽在架构上。
- 执行
/Applications/XAMPP/xamppfiles/bin/php -v查主版本(如 8.1.27) - 执行
/Applications/XAMPP/xamppfiles/bin/php -i | grep -E "Thread Safety|Architecture|Compiler",重点关注:-
Thread Safety => disabled→ 对应 NTS 版本,扩展名必须为swoole.so -
Architecture => aarch64或x86_64→ 决定编译时是否要加arch -x86_64(M1/M2 跑 x86 兼容版 XAMPP 时必需) -
Compiler => GCC 11.2.0或类似 → 编译时不能用太新/太旧的工具链
-
- Windows 用户请改用
findstr并注意 TS/NTS 区分,路径中含php-8.1.27-nts就别下 TS 版 DLL
macOS / Linux 下编译安装 swoole.so(推荐用 pecl)
pecl 是最省心的方式,但 XAMPP 的 pecl 常指向系统 PHP,必须强制指定路径。手动编译只在 pecl 失败或需启用 --enable-http2 等特性时才用。
- 先确保编译工具齐全:
brew install autoconf automake libtool(macOS)或sudo apt install build-essential autoconf(Ubuntu) - 用 XAMPP 自带的
phpize和php-config:/Applications/XAMPP/xamppfiles/bin/phpize/Applications/XAMPP/xamppfiles/bin/php-config --extension-dir(记下输出路径) - 执行:
/Applications/XAMPP/xamppfiles/bin/php -d extension_dir="/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20210902" -m | grep swoole验证是否已存在(有些新版 XAMPP 已预装) - 若无,则运行:
/Applications/XAMPP/xamppfiles/bin/php -d extension_dir="/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20210902" -r "print_r(get_cfg_var('extension_dir'));"
然后:pecl install swoole—— 注意它会自动调用当前phpize和php-config,前提是 PATH 里没混入其他 PHP - 成功后,
pecl会输出类似extension=swoole.so的行,复制这行
修改 php.ini 并验证扩展加载
XAMPP 的 php.ini 路径容易搞错,php --ini 输出的 Loaded Configuration File 才是唯一可信来源,不是 /Applications/XAMPP/xamppfiles/etc/php.ini 就一定对。
立即学习“PHP免费学习笔记(深入)”;
- 执行
/Applications/XAMPP/xamppfiles/bin/php --ini,找到真实路径(常见于/Applications/XAMPP/xamppfiles/etc/php.ini或/Applications/XAMPP/etc/php.ini) - 用文本编辑器打开,搜索
; extension=区块,在末尾新增一行:extension=swoole.so(Linux/macOS)或extension=php_swoole.dll(Windows) - 务必禁用短名:
swoole.use_shortname = Off—— 否则你的代码里定义function go() { }会和 Swoole 内置go()冲突,报Fatal error: Cannot redeclare go() - 保存后执行:
/Applications/XAMPP/xamppfiles/bin/php -m | grep swoole—— 有输出即成功/Applications/XAMPP/xamppfiles/bin/php -r "echo SWOOLE_VERSION . "\n";"—— 能打印版本号才算真正可用
启动 Swoole 应用时不要依赖 XAMPP 的 Apache
Swoole 启动的是独立 TCP 服务(如 WebSocket Server、HTTP Server),Apache 只能代理反向请求,不能直接托管。把 websocket_server.php 放进 htdocs 目录然后用浏览器访问是无效的。
- 写好服务脚本(如监听
0.0.0.0:9501),保存为/Applications/XAMPP/xamppfiles/htdocs/ws.php - 在终端中手动启动:
/Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/ws.php - 确保防火墙放行该端口(macOS:系统设置 → 隐私与安全性 → 防火墙选项 → 允许其他软件通过防火墙)
- 前端连接地址写
ws://localhost:9501,不是http://localhost/ws.php - 需要开机自启或后台运行?用
nohup或pm2(注意 pm2 必须用 XAMPP 的 PHP 执行:pm2 start ws.php --interpreter="/Applications/XAMPP/xamppfiles/bin/php")
最容易被忽略的一点:XAMPP 的 Apache 和 MySQL 服务开着,不代表 Swoole 就能用;PHP CLI 加载的 php.ini 和 Apache SAPI 加载的可能是两个文件,php -m 成功不等于 phpinfo() 里有 swoole —— 务必分别验证 CLI 和 Web 环境。另外,M1/M2 Mac 用户若用 Rosetta 运行 XAMPP,phpize 必须加 arch -x86_64 前缀,否则编译出的 swoole.so 会因架构不匹配而报 mach-o, but wrong architecture。



















