Swoole扩展未加载因composer仅安装PHP包而非C扩展,需用pecl或编译安装并重启PHP环境;端口冲突需查占用进程;读JSON用rawContent();输出日志需指定log_file或协程写入。

composer install 之后 swoole 扩展没加载?
不是代码写错了,是 PHP 没认到扩展。Swoole 是 C 扩展,composer require swoole 只装了 PHP 包,不等于装了底层扩展。
检查方法:php -m | grep swoole,没输出就说明没装扩展。
- Linux/macOS:用
pecl install swoole(需先装pecl和php-dev)或编译安装;Docker 用户注意基础镜像是否含扩展(推荐用php:8.2-cli-swoole这类官方带扩展的镜像) - Windows:基本别折腾,开发环境建议 WSL 或直接切 Docker
- 装完必须重启 PHP-FPM 或 CLI 环境,
php --ri swoole能看到版本才算成功
Swoole\Http\Server 启动报 Address already in use
端口被占了,但未必是你想的“另一个 Swoole 进程”——可能是上一次崩溃没清理干净,也可能是 Laravel Octane、Hyperf、甚至 VS Code 的 PHP 自带服务器在抢 127.0.0.1:9501。
- 查占用:
lsof -i :9501(macOS/Linux)或netstat -ano | findstr :9501(Windows) - 别只 kill 进程号,要确认是不是你自己跑漏的
php server.php没 Ctrl+C 干净 - 新手建议起步用非标端口,比如
9502,避开常见冲突;监听地址写0.0.0.0而非127.0.0.1,方便容器或远程调试
HTTP 服务里怎么读 POST JSON 数据?
$request->rawContent() 是唯一靠谱方式,别试 $_POST 或 $request->post——Swoole 不走 PHP-CGI 那套,$_POST 默认为空,$request->post 只解析 application/x-www-form-urlencoded。
- 前端发
fetch('/api', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({a:1}) }) - 后端收:
$data = json_decode($request->rawContent(), true); - 注意:如果前端发的是空 body 或格式错,
rawContent()返回空字符串,json_decode会返回 null,得自己判空 - 别在
onRequest里反复调用rawContent(),它内部是单次读取缓冲,第二次就拿不到内容了
为什么 var_dump 不显示、日志也不进文件?
Swoole 是常驻内存模型,echo/var_dump 输出默认进 worker 进程 stdout,你敲 php server.php 启动后看到的终端就是它的 stdout;但一旦重定向、后台运行、或用 systemd 管理,这些输出就丢了。
- 开发期加
->set(['log_file' => '/tmp/swoole.log']),所有echo和错误都会进这个文件 - 别依赖
error_log(),它默认走 FPM 的日志通道,在 Swoole 下可能静默失效;改用Swoole\Coroutine::writeFile()或file_put_contents(..., FILE_APPEND) - 协程环境下
var_dump可能卡住或输出错乱,优先用print_r($var, true)+ 日志写入
常驻进程意味着初始化逻辑只跑一次,全局变量、单例、数据库连接池这些,改了代码不重启服务根本不会生效——这点和传统 PHP 完全相反,最容易忽略。









