配合 Supervisor,在 Laravel 里使用 Swoole 创建一个 websocket 服务器 | PHP 技术论坛


本站和网页 https://learnku.com/articles/4633/with-supervisor-use-swoole-to-create-a-websocket-server-in-laravel 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

配合 Supervisor,在 Laravel 里使用 Swoole 创建一个 websocket 服务器 | PHP 技术论坛
PHP
话题列表
社区 Wiki
优质外文
招聘求职
PHP 实战教程
社区文档
登录
注册
PHP
首页
Laravel
Go
PHP
Vue.js
Python
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
Server
程序员
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
文档
社区文档首页
《PHP 内核与原生扩展开发》
《Composer 中文文档》
《Elasticsearch-PHP 中文文档》
《PHP PSR 标准规范》
《PHP 设计模式全集》
登录
注册
微信登录
配合 Supervisor,在 Laravel 里使用 Swoole 创建一个 websocket 服务器
45
10
Lzg 的个人博客
8981
10
创建于 5年前
更新于 3年前
想实现一个wesocket的聊天室,看到网上说swoole对这方面的支持挺好,所以试一下把laravel与swoole结合一下,只是做了个尝试,可以运行成功,具体细节尚未完善。
1、swoole安装请参考官网文档
https://wiki.swoole.com/
2、参考最近手册在laravel里创建一个新的命令swoole
http://laravelacademy.org/post/6842.html
创建一个名叫swoole的命令 php artisan make:command Swoole
在Kernel.php里增加命令列表
protected $commands = [
Commands\Swoole::Class
];
修改swoole文件如下:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Swoole extends Command
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'swoole {action?}';
/**
* The console command description.
* @var string
*/
protected $description = 'swoole';
/**
* Create a new command instance.
* @return void
*/
public function __construct()
parent::__construct();
/**
* Execute the console command.
* @return mixed
*/
public function handle()
$action = $this->argument('action');
switch ($action) {
case 'close':
break;
default:
$this->start();
break;
public function start()
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new \swoole_websocket_server("0.0.0.0", 9502);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
// var_dump($request->fd, $request->get, $request->server);
$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
这个时候就可以在 php artisan list 里查到swoole命令了,具体看手册。
3、详细解读
a、start()函数里调用了swoole的swoole_websocket_server类创建一个websocket服务器,监听9502端口
b、几个事件请看swoole的官方手册,其实就是监听一个socket连接并响应消息。这是一个聊天室的雏形,可以在里使用laravel的任意功能来完成用户聊天室的定位,并给所有人发消息,形成实时聊天功能
c、比如用户登陆后发送消息时附带一个rid(聊天室)过来,程序把fd与rid对应,并给所有rid对应的fd广播消息
4、最好使用supervisor来守护swoole命令,使其在后台一直运行
我的配置如下:
[program:swoole-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/artisan swoole
autostart=true
autorestart=true
user=apache
numprocs=1 //注意这里一定只有一个,端口的问题~~
redirect_stderr=true
stdout_logfile=/path/worker.log
5、在html里实现聊天功能,只能自己跟自己聊,试试长连接,要结合程序请自己尝试~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="发送数据" onclick="song()">
<p>adfssa</p>
</body>
<script>
document.querySelector("body").style.fontSize = '28px';
var msg = document.getElementById("msg");
var wsServer = 'ws://100.100.100.100:9502/'
//调用websocket对象建立连接:
//参数:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen监听连接打开
websocket.onopen = function (evt) {
//websocket.readyState 属性:
/*
CONNECTING 0 The connection is not yet open.
OPEN 1 The connection is open and ready to communicate.
CLOSING 2 The connection is in the process of closing.
CLOSED 3 The connection is closed or couldn't be opened.
*/
msg.innerHTML = websocket.readyState;
};
function song(){
var text = document.getElementById('text').value;
document.getElementById('text').value = '';
//向服务器发送数据
websocket.send(text);
//监听连接关闭
// websocket.onclose = function (evt) {
// console.log("Disconnected");
// };
//onmessage 监听服务器数据推送
websocket.onmessage = function (evt) {
msg.innerHTML += evt.data +'<br>';
// console.log('Retrieved data from server: ' + evt.data);
};
//监听连接错误信息
// websocket.onerror = function (evt, e) {
// console.log('Error occured: ' + evt.data);
// };
</script>
</html>
谢谢各位大神们创造出来这么多好用的库、扩展
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
举报
Lzg
38 声望
暂无个人描述~
45 人点赞
推荐文章:
更多推荐...
博客
您现在应该开始使用的 10 个 PHP 8.1 功能
23
1年前
分享
面试官:如何设计一个高性能短链系统?
31
2年前
博客
PHP-Parse 简介以及在 Hyperf 中的应用
14
2年前
翻译
使用 spatie/async 库来写异步的 PHP 代码
23
10
2年前
博客
Hyperf 2.0 发布!想象的开端!
41
25
2年前
博客
hyperf-im 开源啦! 基于 hyperf 微服务框架 +layim 开发的一套聊天系统!
12
11
2年前
讨论数量: 10
排序:
时间
投票
听风
14 声望
支持
5年前
评论
评论
举报
reatang
23 声望
觉得还是用单文件比较好,毕竟artisan启动的话,变量什么的还是不会主动释放,写业务容易造成内存泄露
5年前
评论
评论
举报
Lzg
38 声望
@reatang 这只是个尝试,主要是在laravel里业务处理起来方便,实际应用还要看需求的
5年前
评论
评论
举报
Timer
65 声望
写的不错,正好需要一个思路。
5年前
评论
评论
举报
Tank
0 声望
请问laravel+swoole如何解决热更新呢?
5年前
评论
评论
举报
Lzg
38 声望
@Tank 我对swoole研究并不多,只是试着玩了下,你可以看看swoole的文档
5年前
评论
评论
举报
罗阳
课程读者
43 声望
@Tank emmmm...swoole结合laravel 代码热更新的问题,你解决了么?我最近也遇到这个问题,同样的..服务也是用artisan命令启动的
5年前
评论
评论
举报
Tank
0 声望
@罗阳 目前用kill
5年前
评论
评论
举报
蘑菇没有了匠人
1 声望
swoole支持后台运行,只要改动一个配置就可以
$this->serv = new swoole_server("0.0.0.0", 9501);
$this->serv->set(array(
'worker_num' => 8,
'daemonize' => false,// 设置后台运行
'max_request' => 10000,
'dispatch_mode' => 2,
'debug_mode'=> 1
));
4年前
评论
评论
举报
易水
课程读者
201 声望
@reatang 单文件启动的话,是指在laravel之外直接用php启动一个单独的文件吗,那样岂不是和laravel相互独立了,在收到消息的回调函数中不能使用laravel中的各种功能了,比如orm、job等
3年前
评论
评论
举报
讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
<a href="javascript:;" class="mr-2 ui popover text-mute" data-html="黏贴或拖拽图片至输入框内皆可上传图片">
<a href="javascript:;" class="mr-2 ui popover text-mute hide-on-mobile" data-html="支持除了 H1~H6 以外的GitHub 兼容 Markdown">
支持 MD
帮助
关注本文
评论
Lzg
未填写
文章
粉丝
18
喜欢
45
收藏
排名:462
访问:1.8 万
关注
私信
所有博文
阅读模式
文章归档
1 篇
2017 年 5 月
最新文章
最受欢迎
5年前
配合 Supervisor,在 Laravel 里使用 Swoole 创建一个 websocket 服务器
45
配合 Supervisor,在 Laravel 里使用 Swoole 创建一个 websocket 服务器
社区赞助商
成为赞助商
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消