Laravel+Swoole 完成一个简单的在线聊天室
前言
前几天一个朋友咨询我关于在线聊天的事情,所以我就顺手写了一个简单的在线聊天系统。
由于我是使用了最新版的Laravel,所以需要在PHP7.0以上的版本才可以搭建,具体的安装和使用可以参考GitHub。感兴趣的可以star或者fork。
chat.gif
WebSocket
网页版的在线聊天一般分为两种方式,轮询和全双工。以传统的HTTP形式来做,Server没办法主动的向Client发送消息,而像WebSocket这种全双工形式则不太一样,二者保持长连接,并且能让Server主动的推送消息到Client,这就大大节省了请求资源。
而Swoole非常方便的以扩展的形式集成了这些高级功能。
思路
建立用户,创建房间这种非常简单的业务逻辑就不再赘述,这里主要讲一下聊天的实现。
由于Swoole的WebSocket都是单独的建立一个PHP进程,所以在数据共享上面我使用了Redis,使用SET来完成每个房间成员的统计,使用HASH来完成每个Connect ID对于房间号的绑定。关于Redis每种类型的使用以及实现原理可以参考我之前写的这篇文章:聊一聊Redis的数据结构。Swoole我以command的形式来处理逻辑,主要参考了这篇文章。
文章首发地址:我的博客
欢迎关注我的公众号,每周至少一篇比较有深度的原创文章:

参考
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer
于 8年前 加精
关于 LearnKu
有详细一点的介绍就更好了
介绍详细一点,写个教程吧,,这也算是高级应用了对很多人来说
@v1talM
@Complicated
好的,回头我抽空写个详细版的,:kissing_heart:
@莱恩 x写写,Swoole怎么在laravel上应用起来,然后怎么操作,嘿嘿,大神 小弟坐等你的教程了,哈哈!一定第一个给你捧场
@Complicated 大家一起学习,哥们太谦虚啦~:wink:
确实如此。小弟也坐等哈@Complicated
出现了一些不堪入目的图片
@L伟 已经处理了,感谢提醒
学习了!!
很赞? 正好最近想做一个类似的功能
也不知道你这套博客能不能开源出来,毕竟这么漂亮
@wujunze 哈哈,多谢吴老师~ :wink:
@仰望 我已经开源了呀,这是地址,这个是使用的
Laravel自身的样式,另外的话error报错页面是使用的,然后error没记错的话应该是使用的@Summer 团队开源的一个博客的模板。@Lichmaker :smiley: 共同学习~
@莱恩 很不错,但上传图片大小限制一下吧,刚才不小心上传了个将近30m的图片:disappointed_relieved:
@liujianmin 如果上传成功,作者疯了。哈哈
@liujianmin 蛮多细节需要完善的:scream:
@泽 然而他已经上传了:sob:
$ws->on('message', function ($ws, $frame) { ... }里为什么能直接使用 laravel 的orm操作数据库, 我使用wokerman在socket连接十几分钟后再次操作数据库就无效了, 没有写入内容到数据库, 感觉是数据库连接断开了, 这里为什么可行?@lazyou @莱恩 还有更优的 Redis 和 ORM 姿势
[PHP中哪些函数是同步阻塞的]https://wiki.swoole.com/wiki/page/474.html
[异步MySQL客户端]https://wiki.swoole.com/wiki/page/517.html
[异步Redis客户端]https://wiki.swoole.com/wiki/page/p-redis....
原来swoolw不支持win啊!
@Nine 期待中
体验网站现在不能用了,
ws.js:63 WebSocket is already in CLOSING or CLOSED state.怎么回事请问是怎么回事
@北冥 第一个问题是因为我服务器的
websocket端口已经关掉了,第二个问题是你本地没有安装swoole扩展作者你好,我clone了你的开源项目后命令都执行完成生成迁移等。安装完
swoole扩展后 访问路由/home或者/room/create都不能打开项目还需要配置什么吗
@springjk @springjk
@springjk
@springjk @springjk 🐂
@springjk 牛
@sprin
@springjk
登录页面的逻辑写在哪里啊,跳转不到登录页面
@张浩浩浩浩 @Echoiii sorry,是我没有说清楚,登录注册逻辑是系统默认的
auth@张浩浩浩浩 还需要执行一下
php artisan make:auth@张浩浩浩浩 可以参考下这个
@张浩浩浩浩 https://baijunyao.com/article/149
求助下 真的是卡到这里了
如图 websocket 建立失败了, 不知道为什么用了 各种 websocket +nginx配置都不行啊
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.
Problem 1
workerman/workerman v3.5.1 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
To enable extensions, verify that they are enabled in your .ini files:
You can also run
php --iniinside terminal to see which files are used by PHP in CLI mode.请问,这个是什么问题
@diobrando 你好,我也遇到了这个问题,可以问下 解决了吗?
@xwh0412 需要在 nginx上配置 websocket的反响代理,
开启链接的 IP 端口号 要与 自己 启动的 websocket 服务的 IP端口号一致
老哥 我把代码clone下来composer install 报错
Problem 1
workerman/workerman v3.5.1 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
To enable extensions, verify that they are enabled in your .ini files:
You can also run
php --iniinside terminal to see which files are used by PHP in CLI mode.是因为我没扩展嘛???