在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)
- laravel项目中的配置 原文出处:https://laravelacademy.org/post/19700.html,感谢原文作者让laravel这款可爱的php框架,进入了高并发的殿堂
如果你已经成功安装了laravelS组件,并用他接管了你的laravel项目,那么接下来就是实现一个websocket服务器的类,
类声明在项目app目录下的Services(没有就自己建一个)目录,
也许这些命名空间已经多的把你吓了一跳,但其实他们都源自你安装的laravelS组件,类的实现部分你也许并不感到陌生,没错,
他们就是按照swoole websocket原生类进行了封装
Hhxsv5类空间的源码可以参照 项目空间下的vendor/hhxsv5/laravel-s/src/Swoole/Coroutine
<?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 mywebsocket implements WebSocketHandlerInterface
{ public function __construct()
{
Log::info('launching laravel-swoole websocket');
} public function onOpen(Server $server, Request $request)
{
Log::info('launching swoole websocket');
$server->push($request->fd,'欢迎使用,基于swoole的laravel websocket');
} public function onMessage(Server $server, Frame $frame)
{
$server->push($frame->fd,date('Y-m-dH:i:s').'服务器响应你的请求');
} public function onClose(Server $server, $fd, $reactorId)
{
Log::info('websocket服务器关闭');
}
}
然后,你就要到config目录下找到laravels.php,进行一番配置。
找到下列关联数组的键名,并作配置
'websocket' => [
'enable' => true,
'handler'=>\App\Services\mywebsocket::class,#这个就是上述声明的类
//'handler' => XxxWebSocketHandler::class,
],
'swoole' => [
... // 每隔 60s 检测一次所有连接,如果某个连接在 600s 内都没有发送任何数据,则关闭该连接
'heartbeat_idle_time' => ,
'heartbeat_check_interval' => , ...
],
- nginx配置部分(分站点配置)
如果你对nginx多站点配置还感到陌生,可以随便搜罗一篇博文来看,这里的配置是在分站点目录vhosts下的,针对目标站点的
.conf文件进行配置的,如果你急于上机,不妨全部拷贝,把域名更改过来
map $http_upgrade $connection_upgrade #这行代码的目的是把http协议 “提升”到websocket协议的标准
{
default upgrade;
'' close;
}
upstream laravels {#server后面是需要监听的ip地址,如果你使用了docker容器部署你的项目,那server后面跟的是容器名
# Connect IP:Port
server yinti.com: weight= max_fails= fail_timeout=30s;
keepalive ;
} server {
listen ;#端口可以根据项目实际需要进行调整
server_name yinti.com;
root /dingshub2/yinti/public;
index index.html index.htm index.php; location / {
# WordPress固定链接URL重写
try_files $uri @laravels; } # PHP配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#下面这段是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 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;
} #我部署的静态资源服务器,你的项目可有可无
location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {
expires 24h;
root /dingshub2/yinti/public/static;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path /dingshub2/yinti/public/static;#图片访问路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffer_size 40k;
proxy_buffers 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1;#默认80端口
}
}
}
- html实现部分(blade模版,继承了母版页)
@extends('masterpage.chatroom') @section('passage')
<div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center">
<h1 class="display-4">帅哥聊天室</h1>
<p class="lead">四海之内皆兄弟,请文明交流</p>
</div>
@endsection @section('pad')
<div class="card-deck mb-3">
<div class="card mb-10 box-shadow">
<div class="card-header">
<h4 class="my-0 font-weight-normal text-center">交流板</h4>
</div>
<div class="card-body">
<h1 class="card-title pricing-card-title"> <small class="text-muted"></small></h1>
<textarea id="chatpad" class='form-control' cols="" rows=""></textarea>
<p style="margin-left: 2px" class="my-0 font-weight-normal">消息输入框</p>
<textarea class='form-control' cols="" rows=""></textarea>
<br>
<button id="joinin" type="button" class="btn btn-lg btn-block btn-outline-primary">进入聊天室</button>
</div>
</div>
</div>
@endsection @section('tailscript')
<script src="{{asset(config('mystatic._js_').'/jquery-3.3.1.min.js')}}" ></script>
<script src="{{asset(config('mystatic._myjs_').'/joinintalk.js')}}"></script>
@endsection
- js具体实现----点击按钮即实现websocket服务器的连接
$("#joinin").click(function()
{
var mysocket = new WebSocket('ws://yinti.com:5200/ws');
mysocket.onopen=function (event) {
$("#chatpad").val("");
$("#chatpad").val("大家好!音提来了\n");
}; });
(未完待续)
在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)的更多相关文章
- 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署
目前,较为成熟的技术是采用laravelS组件,注意和laravel 区别laravelS多了一个大写的S,由于laravelS默认监听5200端口,所以laravel项目要做一些调整 例如: 静态文 ...
- 在laravel5.8中集成swoole组件----初步测试
铺垫 前提是先安装swoole组件,我采用从pecl-----php扩展组件网下载swoole扩展包,然后切入到解压缩的扩展包中运行phpize命令, phpize是一种编译命令,可以在安装文件中生成 ...
- DSAPI多功能组件编程应用-HTTP监听服务端与客户端_指令版
前面介绍了DSAPI多功能组件编程应用-HTTP监听服务端与客户端的内容,这里介绍一个适用于更高效更快速的基于HTTP监听的服务端.客户端. 在本篇,你将见到前所未有的超简化超傻瓜式的HTTP监听服务 ...
- DSAPI多功能组件编程应用-HTTP监听服务端与客户端
本文中,演示了使用DSAPI.网络相关.HTTP监听,快速建立服务端和客户端. HTTP监听服务端的作用,是监听指定计算机端口,以实现与IIS相同的解析服务,提供客户端的网页请求,当然,这不仅仅是应用 ...
- 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)
由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
- app开发中如何利用sessionId来实现服务端与客户端保持回话
app开发中如何利用sessionId来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...
- seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案
seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...
- [Sw] 使用 Swoole Server task/协程 处理大数据量异步任务时注意
关于 Buffered Query 和 Unbuffered Query:http://www.php.net/manual/zh/mysqlinfo.concepts.buffering.php 对 ...
- swoole与php协程实现异步非阻塞IO开发
“协程可以在遇到阻塞的时候中断主动让渡资源,调度程序选择其他的协程运行.从而实现非阻塞IO” 然而php是不支持原生协程的,遇到阻塞时如不交由异步进程来执行是没有任何意义的,代码还是同步执行的,如下所 ...
随机推荐
- elasticsearch 安装head
git clone https://github.com/mobz/elasticsearch-head.git yum install nodejs npm install 修改Elasticsea ...
- quartz报错 org.quartz.impl.StdSchedulerFactory.
quartz任务执行报错 Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFa ...
- (七)Spring 配置 c3p0 连接池
目录 在 Spring 核心配置文件中配置 c3p0 连接池 配置 JdbcTemplate 对象 在 service 层注入 userDao 在 UserDao 里面注入 JdbcTemplate ...
- C程序设计语言练习 第三章
3.3 else-if语句 折半查找,这里通过一个折半查找说明三路判定程序的用法.该函数用于判定已排序好的数组v中是否存在某个特定的值.数组v的元素必须以升序排列.如果v中包含x,则该函数返回x在v中 ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...
- Secret的三种形式
Secret ConfigMap这个资源对象是Kubernetes当中非常重要的一个对象,一般情况下ConfigMap是用来存储一些非安全的配置信息,如果涉及到一些安全相关的数据的话用ConfigMa ...
- spring-boot-plus集成Shiro+JWT权限管理
SpringBoot+Shiro+JWT权限管理 Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以 ...
- Springboot+mybatis+druid 配置多数据源
项目结构 application.yml配置文件 spring: application: name: service datasource: primary: jdbc-url: jdbc:orac ...
- sql 将英文句子中的单词首字母转换为大写
create function dbo.pTitleCase(@StrIn nvarchar(max))returns nvarchar(max)as begin; declare @StrOut n ...
- linux MD5使用
# define MD5_LONG unsigned int # define MD5_CBLOCK 64 # define MD5_LBLOCK (MD5_CBLOCK/4) # define MD ...