Laravel+Swoole 完成一个简单的在线聊天室

前言

前几天一个朋友咨询我关于在线聊天的事情,所以我就顺手写了一个简单的在线聊天系统。
由于我是使用了最新版的Laravel,所以需要在PHP7.0以上的版本才可以搭建,具体的安装和使用可以参考GitHub。感兴趣的可以star或者fork

GitHub
在线体验

chat.giffile

WebSocket

网页版的在线聊天一般分为两种方式,轮询和全双工。以传统的HTTP形式来做,Server没办法主动的向Client发送消息,而像WebSocket这种全双工形式则不太一样,二者保持长连接,并且能让Server主动的推送消息到Client,这就大大节省了请求资源。
Swoole非常方便的以扩展的形式集成了这些高级功能。

思路

建立用户,创建房间这种非常简单的业务逻辑就不再赘述,这里主要讲一下聊天的实现。
由于SwooleWebSocket都是单独的建立一个PHP进程,所以在数据共享上面我使用了Redis,使用SET来完成每个房间成员的统计,使用HASH来完成每个Connect ID对于房间号的绑定。关于Redis每种类型的使用以及实现原理可以参考我之前写的这篇文章:聊一聊Redis的数据结构
Swoole我以command的形式来处理逻辑,主要参考了这篇文章

文章首发地址:我的博客

欢迎关注我的公众号,每周至少一篇比较有深度的原创文章:

Laravel+Swoole 完成一个简单的在线聊天室

参考

Laravel如何优雅的使用Swoole

本作品采用《CC 协议》,转载必须注明作者和本文链接
Nine
本帖由 Summer 于 6年前 加精
讨论数量: 41
v1talM

有详细一点的介绍就更好了

6年前 评论
Complicated

介绍详细一点,写个教程吧,,这也算是高级应用了对很多人来说

6年前 评论

@v1talM
@Complicated
好的,回头我抽空写个详细版的,:kissing_heart:

6年前 评论
Complicated

@莱恩 x写写,Swoole怎么在laravel上应用起来,然后怎么操作,嘿嘿,大神 小弟坐等你的教程了,哈哈!一定第一个给你捧场

6年前 评论

@Complicated 大家一起学习,哥们太谦虚啦~:wink:

6年前 评论

确实如此。小弟也坐等哈@Complicated

6年前 评论

出现了一些不堪入目的图片

6年前 评论

@L伟 已经处理了,感谢提醒

6年前 评论

很赞? 正好最近想做一个类似的功能

6年前 评论
巴啦啦

也不知道你这套博客能不能开源出来,毕竟这么漂亮

6年前 评论

@wujunze 哈哈,多谢吴老师~ :wink:

6年前 评论

@仰望 我已经开源了呀,这是地址,这个是使用的Laravel自身的样式,另外的话error报错页面是使用的,然后error没记错的话应该是使用的@Summer 团队开源的一个博客的模板。

6年前 评论

@Lichmaker :smiley: 共同学习~

6年前 评论

@莱恩 很不错,但上传图片大小限制一下吧,刚才不小心上传了个将近30m的图片:disappointed_relieved:

6年前 评论

@liujianmin 如果上传成功,作者疯了。哈哈

6年前 评论

@liujianmin 蛮多细节需要完善的:scream:

6年前 评论

@泽 然而他已经上传了:sob:

6年前 评论

$ws->on('message', function ($ws, $frame) { ... } 里为什么能直接使用 laravel 的orm操作数据库, 我使用 wokerman 在socket连接十几分钟后再次操作数据库就无效了, 没有写入内容到数据库, 感觉是数据库连接断开了, 这里为什么可行?

6年前 评论

@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....

6年前 评论
Complicated

原来swoolw不支持win啊!

6年前 评论
北冥

体验网站现在不能用了,ws.js:63 WebSocket is already in CLOSING or CLOSED state. 怎么回事

5年前 评论
北冥
$ php artisan swoole:action start

In Swoole.php line 84:
Class 'swoole_websocket_server' not found

$ws = new \swoole_websocket_server(config('swoole.host'), config('swoole.port'));

请问是怎么回事

5年前 评论

@北冥 第一个问题是因为我服务器的websocket端口已经关掉了,第二个问题是你本地没有安装swoole扩展

5年前 评论
张浩浩浩浩

作者你好,我clone了你的开源项目后命令都执行完成生成迁移等。安装完swoole扩展后 访问路由/home 或者 /room/create 都不能打开项目

NotFoundHttpException in RouteCollection.php line 161:

还需要配置什么吗

5年前 评论

登录页面的逻辑写在哪里啊,跳转不到登录页面

5年前 评论

@张浩浩浩浩 @Echoiii sorry,是我没有说清楚,登录注册逻辑是系统默认的auth

5年前 评论

@张浩浩浩浩 还需要执行一下php artisan make:auth

5年前 评论

求助下 真的是卡到这里了

file
如图 websocket 建立失败了, 不知道为什么用了 各种 websocket +nginx配置都不行啊

5年前 评论

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

  • Installation request for workerman/workerman v3.5.1 -> satisfiable by workerman/workerman[v3.5.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:

  • G:\object_tool\PHPWAMP_IN2\phpwamp\server\php-7.2\php.ini
    You can also run php --ini inside terminal to see which files are used by PHP in CLI mode.

请问,这个是什么问题

5年前 评论

@diobrando 你好,我也遇到了这个问题,可以问下 解决了吗?

5年前 评论

@xwh0412 需要在 nginx上配置 websocket的反响代理,

5年前 评论

开启链接的 IP 端口号 要与 自己 启动的 websocket 服务的 IP端口号一致

5年前 评论
QINTIANZHU

老哥 我把代码clone下来composer install 报错
Problem 1

  • Installation request for workerman/workerman v3.5.1 -> satisfiable by workerman/workerman[v3.5.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:

  • D:\PHPTutorial\php\php-7.1.13-nts\php.ini
    You can also run php --ini inside terminal to see which files are used by PHP in CLI mode.
    是因为我没扩展嘛???
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!