准备工作

  1. windows环境使用docker搭建
    安装swoole扩展
    在本地安装的话,以 Laradock 为例,需要在 laradock 目录下的 .env 中将下面两行配置值设置为 true

WORKSPACE_INSTALL_SWOOLE=true
PHP_FPM_INSTALL_SWOOLE=true

执行 docker-compose build php-fpm workspace 即可,执行完以后记得重启服务

  1. 项目根目录安装hhxsv5/laravel-s扩展

composer require hhxsv5/laravel-s

该扩展包具备自动发现功能(Laravel 5.5 以上版本可用),无需手动在 config/app.php 配置文件中注册,安装完成后,运行如下 Artisan 命令相应脚本和配置文件发布到根目录下:

php artisan laravels publish

可以查看https://github.com/hhxsv5/laravel-s/blob/master/README-CN.md文档

项目配置

修改config/laravels配置

‘websocket’ => [
‘enable’ => true, // 看清楚,这里是true
‘handler’ => \App\Services\WebSocketService::class,
],
‘swoole’ => [
// dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/wiki/page/277.html
‘dispatch_mode’ => 2,
// …
],

env配置(本人使用的docker环境,其他环境请自行修改ip)

LARAVELS_LISTEN_IP=workspace
LARAVELS_DAEMONIZE=true

nginx反向代理配置

map $http_upgrade $connection_upgrade {default upgrade;''      close;
}
upstream swoole {# 通过 IP:Port 连接server workspace:5200 weight=5 max_fails=3 fail_timeout=30s;keepalive 16;
}
server {listen 80;# 别忘了绑Hostserver_name blogtest.localhost;root /var/www/laravel_demo/public;index index.php index.html index.htm;# Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。location / {try_files $uri @laravels;}# 当请求PHP文件时直接响应404,防止暴露public/*.php#location ~* \.php$ {#    return 404;#}# Http和WebSocket共存,Nginx通过location区分# !!! WebSocket连接时路径为/ws# Javascript: var ws = new WebSocket("ws://blogtest.localhost/ws");location =/ws {# proxy_connect_timeout 60s;# proxy_send_timeout 60s;# proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,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://swoole;}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://swoole;}
}

nginx配置查看https://laravelacademy.org/post/19700

swoole简单demo

  1. 创建 App\Services\WebSocketService.php
<?php
namespace App\Services;use Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;/*** @see https://wiki.swoole.com/wiki/page/400.html*/
class WebSocketService implements WebSocketHandlerInterface
{// 声明没有参数的构造函数public function __construct(){}public function onOpen(Server $server, Request $request){// 在触发onOpen事件之前Laravel的生命周期已经完结,所以Laravel的Request是可读的,Session是可读写的// \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);$server->push($request->fd, 'Welcome to LaravelS');// throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理}public function onMessage(Server $server, Frame $frame){// \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);$server->push($frame->fd, $frame->data);// throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理}public function onClose(Server $server, $fd, $reactorId){// throw new \Exception('an exception');// 此时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理}
}
  1. 创建控制器 IndexController.php
<?php
namespace App\Http\Controllers;class IndexController extends Controller
{public function index(){return view('index');}
}
  1. view试图:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Chat Client</title>
</head>
<body>
<div style="width:600px;margin:0 auto;border:1px solid #ccc;"><div id="content" style="overflow-y:auto;height:300px;"></div><hr /><div style="height:40px;background:white;"><input type="text" class="form-control" id="message"  placeholder="请输入内容"><button type="button" class="btn btn-primary" onclick="sendMessage()">Primary</button></div>
</div><script type="text/javascript">if(window.WebSocket){// 端口和ip地址对应不要写错  写自己的配置 var webSocket = new WebSocket("ws://blogtest.localhost/ws");webSocket.onopen = function (event) {console.log('webSocket 连接成功');};// 连接关闭时触发webSocket.onclose = function (event) {console.log("WebSocket 关闭连接");}//收到服务端消息回调webSocket.onmessage = function (event) {var content = document.getElementById('content');content.innerHTML = content.innerHTML.concat('<p style="margin-left:20px;height:20px;line-height:20px;">'+event.data+'</p>');console.log(event.data)}var sendMessage = function(){var data = document.getElementById('message').value;webSocket.send(data);}}else{console.log("您的浏览器不支持WebSocket");}
</script></body>
</html>
  1. 启动laravels:

php bin/laravels start


具体可以查看https://github.com/hhxsv5/laravel-s文档

  1. 运行结果

注意: 修改了代码以后执行

php bin/laravels reload
或者 php bin/laravels restart

相关文档:https://laravelacademy.org/post/9801
https://www.bookstack.cn/read/LaravelS/spilt.8.d7f5aa7b24640641.md
laradvels配置说明https://github.com/hhxsv5/laravel-s/blob/master/Settings-CN.md
laravels使用说明https://github.com/hhxsv5/laravel-s/blob/master/README-CN.md

在laravel中集成swoole,使用hhxsv5/laravel-s扩展相关推荐

  1. 在laravel5.8中集成swoole组件----初步测试

    铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...

  2. php swoole 项目实战,Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)...

    最近使用swoole做了项目,里面设计推送信息给界面前端,和无登陆用户的状态监控,以下是本人从中获取的一点心得,有改进的地方请留言评论. 1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检 ...

  3. php 集成paypal,Laravel中集成PayPal

    最近在写一个面向国外买家的一个商城项目,既然面向国外,那就要用到PayPal这个支付平台.因为在对接PayPal的过程中遇到了一些问题,花费了一些时间,所以把对接的过程记下来,也希望能帮助到用到Pay ...

  4. 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)

    laravel项目中的配置  原文出处:https://laravelacademy.org/post/19700.html,感谢原文作者让laravel这款可爱的php框架,进入了高并发的殿堂 如果 ...

  5. 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

    目前,较为成熟的技术是采用laravelS组件,注意和laravel 区别laravelS多了一个大写的S,由于laravelS默认监听5200端口,所以laravel项目要做一些调整 例如: 静态文 ...

  6. 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(一)

    注意,这种风格的服务端需要swoole4.4以上,这种风格的服务端需要swoole4.4以上,这种风格的服务端需要swoole4.4以上,重要的事情说三遍!!! 服务端 <?php //name ...

  7. 如何在 Laravel 中 “规范” 的开发验证码发送功能

    需求场景 发送「验证码」或者「消息通知」,可发送到手机或邮箱中. 完成 首先,在 Laravel 中的规范就是使用 Laravel 的「消息通知」,这里基于场景为「验证码」.这个需求几乎所有软件系统都 ...

  8. php调用nexmo发送短信,在 Laravel 中 “规范” 的开发短信验证码发送功能

    Laravel简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行 ...

  9. Laravel 中简约而不简单的 Macroable 宏指令

    百度百科的定义: 计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是 ...

最新文章

  1. Android之异步消息处理机制Handler源码解析
  2. Linux 命令之 timedatectl -- 查看系统当前时区设置
  3. windows安装TortoiseGit详细使用教程
  4. python传文件给堡垒机上远程的另一个机器_如何用hive调度堡垒机上的python脚本...
  5. C# 委托实例(跨窗体操作控件)
  6. python 字符串分割
  7. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
  8. 跟我学习Storm_Storm基本架构
  9. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端
  10. python查看函数消耗的内存_用sys.getsizeof查看对象占用内存数
  11. 自学JAVA-2:数据类型与运算符
  12. Apache部署多个WordPress网站
  13. 大物实验计算弹性模量_什么是材料的杨氏模量?它的定义与计算公式是什么?...
  14. nginx 区分手机浏览器和pc浏览器
  15. 标签打印机打印亚马逊外箱FBA标签
  16. 爬虫技术(01)神箭手爬虫初学案例解读
  17. 全球及中国3,4-二氯异噻唑-5-羧酸行业研究及十四五规划分析报告
  18. 自然语言处理总复习(九)—— 机器翻译
  19. Win2003合并磁盘分区
  20. 微x模块怎么导入主题_模块

热门文章

  1. 2020下半年总结:void
  2. Bugku,Crypto:聪明的小羊
  3. HTML制作的私人网盘,在自己的服务器上一键搭建私人网盘
  4. 数控铣削图案及编程_数控铣床编程实例.
  5. java设备imei号_Java IMEI串号生成规则
  6. linux为什么 windows系统安装,为什么我装了Linux以后就无法重新安装Windows
  7. 杭州亚运会改至2023年9月23日至10月8日举行
  8. 微信好友误删了怎么恢复?巧用这几招,悄悄加回不尴尬
  9. 数据化运营09 抓住问题关键:用相关性分析拆解多个影响因素
  10. 借力算法,海天瑞声驾驭自动驾驶“新引擎”