在 Laravel 中集成 Swoole 实现 WebSocket 服务器 | 快速入门 | Swoole 从入门到实战教程


本站和网页 https://xueyuanjun.com/post/19700.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

在 Laravel 中集成 Swoole 实现 WebSocket 服务器 | 快速入门 | Swoole 从入门到实战教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Swoole 从入门到实战教程
目录索引
快速入门
4篇文章
Swoole 扩展安装与使用入门
基于 Swoole 实现高性能 HTTP 服务器
基于 Swoole 实现简单的 WebSocket 服务器及客户端
在 Laravel 中集成 Swoole 实现 WebSocket 服务器
异步处理
3篇文章
基于 Swoole 定时器实现毫秒级任务调度
基于 Swoole 在 Laravel 中实现异步任务队列
基于 Swoole 在 Laravel 中实现异步事件监听及处理
并发编程之多进程篇
4篇文章
通过 Process 模块在 PHP 中实现多进程(一):简单的多进程 TCP 服务器实现
基于 Process 模块在 PHP 中实现多进程(二):进程间通信
基于 Process\Pool 通过进程池实现数据库和 Redis 的持久连接
通过 Swoole\Table 实现 Swoole 多进程数据共享
并发编程之协程篇
4篇文章
基于 Swoole 实现协程篇(一):基本概念和底层原理
基于 Swoole 实现协程篇(二):通过协程实现并发编程
基于 Swoole 实现协程篇(三):在 Laravel 框架中使用协程
基于 SMProxy 通过协程调度实现 MySQL 连接池
底层原理篇
2篇文章
Swoole 的底层架构及运行原理
Swoole 驱动的 Laravel 应用优化原理及注意事项
实战篇
19篇文章
基于 Swoole 实现支持高并发的实时弹幕功能(上)
基于 Swoole 实现支持高并发的实时弹幕功能(下)
基于 Swoole 开发实时在线聊天室(一):环境准备篇
基于 Swoole 开发实时在线聊天室(二):后台数据库准备和 API 认证功能实现
基于 Swoole 开发实时在线聊天室(三):后台 WebSocket 服务器实现
基于 Swoole 开发实时在线聊天室(四):前端资源初始化
基于 Swoole 开发实时在线聊天室(五):Homestead 开发环境初始化
基于 Swoole 开发实时在线聊天室(六):建立 socket.io 客户端与 Swoole Websocket 服务器的连接
基于 Swoole 开发实时在线聊天室(七):基于 Muse UI 3.0 的前端用户认证功能实现
基于 Swoole 开发实时在线聊天室(八):Websocket 服务端重构与用户认证
基于 Swoole 开发实时在线聊天室(九):实现客服机器人聊天功能
基于 Swoole 开发实时在线聊天室(十):用户登录后获取未读消息数
基于 Swoole 开发实时在线聊天室(十一):进入聊天室后获取历史聊天记录
基于 Swoole 开发实时在线聊天室(十二):加入和退出聊天室房间功能实现
基于 Swoole 开发实时在线聊天室(十三):发送文本/表情消息
基于 Swoole 开发实时在线聊天室(十四):发送图片消息
基于 Swoole 开发实时在线聊天室(十五):实现用户头像上传功能
基于 Swoole 开发实时在线聊天室(十六):轮询保持长连接优化
基于 Swoole 开发实时在线聊天室(十七):Websocket 通信用户认证逻辑优化
图书
Swoole 从入门到实战教程
快速入门
在 Laravel 中集成 Swoole 实现 WebSocket 服务器
在 Laravel 中集成 Swoole 实现 WebSocket 服务器
由 学院君 创建于3年前, 最后更新于 3年前
版本号 #2
48213 views
9 likes
2 collects
在上篇教程中,我们基于 Swoole 实现了简单的 WebSocket 服务器,然后在客户端通过 JavaScript 实现了 WebSocket 客户端,并演示了 WebSocket 的握手和通信过程,今天,学院君将基于 LaravelS 扩展包把 Swoole 集成到 Laravel 项目来实现 WebSocket 服务器,以便与客户端进行 WebSocket 通信从而实现广播功能。
创建 WebSocketService 类
关于 LaravelS 扩展包我们之前在介绍基于 Swoole 实现 HTTP 服务器的时候已经提到过了,这里不再赘述,没有安装的同学可以去参考那篇教程进行安装和配置,要基于该扩展包实现 WebSocket 服务器,首先首先需要创建一个实现了 Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface 接口的 WebSocketService 类:
<?php
namespace App\Services;
use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
use Illuminate\Support\Facades\Log;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
class WebSocketService implements WebSocketHandlerInterface
public function __construct()
// 连接建立时触发
public function onOpen(Server $server, Request $request)
// 在触发 WebSocket 连接建立事件之前,Laravel 应用初始化的生命周期已经结束,你可以在这里获取 Laravel 请求和会话数据
// 调用 push 方法向客户端推送数据,fd 是客户端连接标识字段
Log::info('WebSocket 连接建立');
$server->push($request->fd, 'Welcome to WebSocket Server built on LaravelS');
// 收到消息时触发
public function onMessage(Server $server, Frame $frame)
// 调用 push 方法向客户端推送数据
$server->push($frame->fd, 'This is a message sent from WebSocket Server at ' . date('Y-m-d H:i:s'));
// 关闭连接时触发
public function onClose(Server $server, $fd, $reactorId)
Log::info('WebSocket 连接关闭');
在这个 WebSocket 服务器类中,需要实现接口中声明的方法,其实就是 WebSocket 通信事件的回调函数,和上篇教程介绍的原生实现基本一致,只是通过类进行了封装而已。
修改配置文件
接下来,打开配置文件 config/laravels.php,启用 WebSocket 通信并将刚刚创建的服务器类配置到对应的配置项:
'websocket' => [
'enable' => true,
'handler' => \App\Services\WebSocketService::class,
],
我们还可以在 swoole 配置项中配置 WebSocket 长连接的强制关闭逻辑:
'swoole' => [
...
// 每隔 60s 检测一次所有连接,如果某个连接在 600s 内都没有发送任何数据,则关闭该连接
'heartbeat_idle_time' => 600,
'heartbeat_check_interval' => 60,
...
],
配置 Nginx 支持 WebSocket
由于 WebSocket 通信是基于 HTTP 协议的,所以,我们还要配置 HTTP 服务器来支持 WebSocket 请求,以 Nginx 为例,我们在基于 Swoole 实现 HTTP 服务器一节中添加的 Nginx 配置文件基础上进行 WebSocket 配置,为了与之前基于 PHP-FPM 作为进程管理器的站点配置区分开,创建一个新的站点配置 todoapp-s.conf(基于待办任务项目进行测试),编辑配置文件内容如下:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
upstream laravels {
# Connect IP:Port
server workspace:5200 weight=5 max_fails=3 fail_timeout=30s;
keepalive 16;
server {
listen 80;
server_name todo-s.test;
root /var/www/todoapp/public;
error_log /var/log/nginx/todoapp_s_error.log;
access_log /var/log/nginx/todoapp_s_access.log;
index index.php index.html index.htm;
# Nginx handles the static resources(recommend enabling gzip), LaravelS handles the dynamic resource.
location / {
try_files $uri @laravels;
# Response 404 directly when request the PHP file, to avoid exposing public/*.php
#location ~* \.php$ {
# return 404;
#}
# Http and WebSocket are concomitant, Nginx identifies them by "location"
# !!! The location of WebSocket is "/ws"
# Javascript: var ws = new WebSocket("ws://todo-s.test/ws");
# 处理 WebSocket 通信
location =/ws {
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout: Nginx will close the connection if the proxied server does not send data to Nginx in 60 seconds; At the same time, this close behavior is also affected by heartbeat setting of Swoole.
# proxy_read_timeout 60s;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://laravels;
location @laravels {
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout 60s;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
学院君的本地开发环境是 Laradock,所以配置的监听 IP 是 Docker 容器名称 workspace,如果你不是在 Laradock 中开发,需要将其改成自己的 Swoole WebSocket Server 监听 IP。
配置完成后,即可构建容器并重新启动:
docker-compose build nginx
docker-compose down
docker-compose up -d nginx mysql
此外,记得在对应 Laravel 项目根目录下 .env 环境配置文件中设置如下配置项:
LARAVELS_LISTEN_IP=workspace // 这里的 IP 需要和 nginx upstream 中配置的监听 IP 保持一致
LARAVELS_DAEMONIZE=true
演示基于 Laravel 的 WebSocket 通信
在 Laravel 项目根目下启动 Swoole 服务器:
php bin/laravels start
启动成功后,就可以看到基于 Swoole 的 HTTP 服务器和 WebSocket 服务器信息了:
然后,我们基于上一篇教程创建的 WebSocket 客户端,将其中的 WebSocket Server IP 和端口修改如下:
// 初始化 WebSocket 客户端套接字并建立与服务器的连接
var socket = new WebSocket("ws://todo-s.test/ws");
在浏览器中访问这个客户端 HTML 文件,在弹出窗口输入用户名:
然后点击「确定」,即可开始建立与 Laravel WebSocket 服务器的通信:
在开发者工具栏 Network->WS 标签页同样可以看到基于 HTTP 协议的 Websocket 通信握手和建立过程:
如果我们在输入框中发送消息,即可触发 WebSocket 服务器推送消息给客户端:
同时,在 storage/logs 目录下也可以看到通信连接建立与断开的日志信息:
[2019-05-22 13:55:02] local.INFO: WebSocket 连接建立
[2019-05-22 13:55:10] local.INFO: WebSocket 连接关闭
[2019-05-22 13:56:25] local.INFO: WebSocket 连接建立
[2019-05-22 13:57:25] local.INFO: WebSocket 连接关闭
[2019-05-22 14:01:18] local.INFO: WebSocket 连接建立
[2019-05-22 14:02:20] local.INFO: WebSocket 连接关闭
在下一篇教程中,学院君将会把这个自定义的服务器作为 Laravel Echo 的服务端,在 Laravel 中实现基于 Swoole 的广播通信。
Laravel
教程
Swoole
WebSocket
服务器
Nginx
HTTP
扩展包
LaraDock
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
基于 Swoole 实现简单的 WebSocket 服务器及客户端
>> 下一篇:
基于 Swoole 定时器实现毫秒级任务调度
50 条评论
#41
tiger188
评论于 1年前
正在删除评论...
“在下一篇教程中,学院君将会把这个自定义的服务器作为 Laravel Echo 的服务端,在 Laravel 中实现基于 Swoole 的广播通信。 “,这个ceho教程在哪里?
#42
Totn
评论于 1年前
正在删除评论...
nginx的conf配置那里捉个虫;
# 处理 WebSocket 通信
location =/ws {
多了一个“=”
应改为
# 处理 WebSocket 通信
location /ws {
直接复制配置的conf无法联接,折腾了半天
#45
tiger188
评论于 1年前
正在删除评论...
@ 学院君 这里面可以实现多个WebSocket服务器吗?看到配置只能启动一个,不够用啊。
我也想问这个问题。可以启用多个WebSocket服务,监听不同的端口。我有多个页面,不同的功能,想一个页面配一个websocket服务器,可以吗? 还是只能一个,分为不同的chanel呢?
#46
tiger188
评论于 1年前
&bull;
更新于 1年前 (tiger188)
正在删除评论...
控制器里使用 app('swoole')->push(),为啥我再控制器里用了,始终报错:Target class [swoole] does not exist.
请大神看看这个问题。我没有配置nginx的原因吗?是不是必须要配置nginx?
#47
tiger188
评论于 1年前
正在删除评论...
@Totn location =/ws { 有等于号也没有错
#48
学院君
评论于 1年前
回复 #45
正在删除评论...
肯定可以支持多个啊 就是多启动一个进程而已 监听接口变更下
#49
学院君
评论于 1年前
回复 #42
正在删除评论...
你搞清楚=是干嘛用的 怎么用再来下结论 我既然贴出来肯定是自己本地测试通过的
#50
tiger188
评论于 1年前
回复 #48
正在删除评论...
在哪里多启动一个?能讲一下具体怎么操作吗?谢谢
#51
张若初
评论于 1年前
正在删除评论...
nginx 的配置看不懂
#52
chacha
评论于 1年前
回复 #40
正在删除评论...
我也这样,请问你找到问题了吗
&lsaquo;
&rsaquo;
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
创建 WebSocketService 类
修改配置文件
配置 Nginx 支持 WebSocket
演示基于 Laravel 的 WebSocket 通信
相关推荐
基于 Swoole 实现高性能 HTTP 服务器
Swoole 从入门到实战教程
快速入门
基于 Swoole 实现简单的 WebSocket 服务器及客户端
Swoole 从入门到实战教程
快速入门
基于 Swoole 实现支持高并发的实时弹幕功能(下)
Swoole 从入门到实战教程
实战篇
基于 Swoole 开发实时在线聊天室(三):后台 WebSocket 服务器实现
Swoole 从入门到实战教程
实战篇
目录索引
Swoole 从入门到实战教程
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助