php websocket服务需直接运行脚本启动,因swoole是常驻进程,不依赖apache/nginx或artisan;php artisan swoole:websocket start仅在安装laravel-swoole扩展后有效,纯swoole项目须用php websocket_server.php启动,并确保使用swoole\websocket\server实例、正确端口与防火墙配置。

直接运行 PHP 脚本即可启动,不需要 Apache/Nginx 或 Artisan 命令(除非你用了 Laravel-Swoole 这类封装)。
为什么不能用 php artisan swoole:websocket start?
这个命令只在 Laravel-Swoole 扩展中存在,它本质是封装了原生 Swoole 启动逻辑。如果你没装这个包,执行会报错:Command "swoole:websocket" is not defined。纯 Swoole 项目不依赖 Laravel,也不认这个命令。
- 确认是否真的用了
laravel-swoole:检查composer.json里有没有"topthink/think-swoole"或"swooletw/laravel-swoole" - 没用就别配
artisan相关命令,避免浪费时间排查不存在的命令 - 用了也要注意版本兼容性——比如
think-swoole 2.0.0对应的是 ThinkPHP 6,不是 Laravel
最简启动方式:php websocket_server.php
写好服务端脚本后,终端里直接运行它。这是 Swoole 官方推荐、最可控的方式。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 脚本必须用
Swoole\WebSocket\Server实例化,不能用Swoole\Server(那是 TCP 服务器) - 监听地址建议写
"0.0.0.0"而非"127.0.0.1",否则外部机器连不上 - 端口避开 80/443/8080 等常用端口,比如用
9502或9505,避免权限或冲突问题 - 启动后终端会阻塞,不会自动退出;Ctrl+C 可停止
示例最小可运行代码:
<?php $server = new Swoole\WebSocket\Server("0.0.0.0", 9502);
$server->on('open', function ($server, $request) {
echo "connection open: {$request->fd}\n";
});
$server->on('message', function ($server, $frame) {
$server->push($frame->fd, "pong");
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
生产环境必须加 daemonize 和日志
直接前台运行适合调试,但上线必须后台守护,否则终端关闭服务就挂了。
- 在
$server->set([...])中加入'daemonize' => true - 同时配
'log_file' => '/var/log/swoole-websocket.log',否则错误全丢进黑洞 - 启动后用
ps aux | grep websocket_server确认进程是否存在 - 别依赖 nohup & —— Swoole 自带守护机制更稳定,且能正确处理子进程和信号
真正容易被忽略的是:启动成功 ≠ 客户端能连上。90% 的连接失败不是代码问题,而是防火墙没开端口、Nginx 代理配置漏了 Upgrade 头、或者前端 URL 写成了 ws://localhost:9502 却从域名访问——这些得单独查,跟 $server->start() 本身无关。










