xampp的php路径与extension_dir必须严格一致,根本原因是phpize和php-config若指向系统php而非xampp内置路径(如/opt/lampp/bin/phpize),会导致编译的swoole.so abi不匹配;需用/opt/lampp/bin/php-config --extension-dir获取真实路径,并确保php.ini中extension_dir与之完全相同,且所有操作在wsl原生路径(非/mnt/c/)下进行。

确认 XAMPP 的 PHP 路径和 extension_dir 是否真实一致
很多人在 WSL 里装完 swoole.so 却 php -m 看不见,根本原因不是编译失败,而是 phpize 和 php-config 指向了系统自带 PHP(比如 Ubuntu 自带的 /usr/bin/php),而不是 XAMPP 自己的 PHP。XAMPP for Linux 默认装在 /opt/lampp/,它的 CLI 和 Apache 共享同一套 PHP,但路径必须手动对齐。
执行以下命令验证:
-
/opt/lampp/bin/php -v—— 记下版本(如 8.2.12) -
/opt/lampp/bin/php-config --extension-dir—— 输出的就是你必须写入php.ini的extension_dir值 -
/opt/lampp/bin/php -i | grep "Loaded Configuration File"—— 找到真实生效的php.ini路径(通常是/opt/lampp/etc/php.ini)
注意:WSL 中若把项目放在 /mnt/c/ 下运行,XAMPP 可能因文件系统权限或符号链接问题无法加载扩展,建议所有操作(包括解压源码、编译)都在 /home/xxx/ 或 /opt/lampp/ 下进行。
用 XAMPP 自带工具链编译 swoole.so(别用 pecl install)
WSL 下 pecl install swoole 极大概率失败——它会调用系统 phpize,生成的 swoole.so ABI 不匹配,加载时直接报 undefined symbol: zend_string_init 或静默失败。
正确做法是全程绑定 XAMPP 工具:
- 下载与 PHP 版本对应的 Swoole 源码(例如 PHP 8.2 →
swoole-src-v5.1.1),解压进临时目录 - 进入源码目录后执行:
/opt/lampp/bin/phpize - 再执行:
./configure --with-php-config=/opt/lampp/bin/php-config --enable-openssl(--enable-openssl开启 HTTPS/WebSocket 必需) -
make && sudo make install—— 成功后提示安装路径,必须和上一步php-config --extension-dir输出完全一致
检查该目录下是否真有 swoole.so:例如 /opt/lampp/lib/php/extensions/no-debug-non-zts-20220829/swoole.so。没有就说明编译路径错位,重来。
Windows 文件系统跨挂载导致 extension 加载失败
这是 WSL 用户独有、且极易忽略的问题:如果你把 XAMPP 安装在 /mnt/c/xampp(即 Windows 盘),然后在 WSL 终端里用 /mnt/c/xampp/bin/phpize 编译,生成的 swoole.so 会被写入 Windows NTFS 分区。而 Linux 内核对 NTFS 的 mmap 和 dlopen 支持不稳定,加载时可能无提示失败,php --ri swoole 直接报 “Extension 'swoole' not present”。
解决方案只有两个:
- 把 XAMPP 完全装在 WSL 根文件系统内(如
/opt/lampp),所有操作(下载、解压、编译、修改 php.ini)都在 WSL 原生路径下完成 - 若必须用 Windows 版 XAMPP,请改用 Windows 原生环境安装(而非 WSL),XAMPP + Swoole 在 Win10/11 上更稳定
别试图用 sudo chmod 755 或 chown 修复 NTFS 上的 .so 文件——NTFS 权限映射在 WSL 里不可靠,治标不治本。
CLI 和 Web 层要分别验证,Apache 不托管 Swoole 服务
装完 swoole.so 后,别急着写 TCP 服务器。先分两步验证:
- CLI 层:
/opt/lampp/bin/php --ri swoole—— 必须输出版本号、enabled、协程支持等信息;如果报 “Extension 'swoole' not present”,说明php.ini路径错或extension_dir不对 - Web 层:建
/opt/lampp/htdocs/info.php,内容为<?php phpinfo(); ?>,浏览器访问 http://localhost/info.php,搜索 “swoole”,确认模块已列出
验证通过后,Swoole 应用必须用 CLI 启动:/opt/lampp/bin/php server.php,不能扔进 Apache 目录指望它自动跑。Apache 只负责静态资源或传统 PHP-FPM 请求,Swoole 的 TCP/HTTP/WebSocket 服务是独立进程,监听端口(如 9501),和 Apache 无关。
最后提醒:XAMPP 本质是开发集成包,不是生产环境。Swoole 的多进程模型在 XAMPP 的 Apache 进程管理下容易冲突,上线前务必迁移到原生 LAMP 或 Docker 环境。











