<?php
/**
* Created by PhpStorm.
* User: weisheng
* Date: 2018/3/26
* Time: 20:14
*/php
/*
* 高并发和大流量解决方案考点
* 1.高并发架构相关概念
* 2.高并发解决方案
*/css
/*
* 高并发相关概念
* 1.并发:在操做系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一时刻点上只有一个程序在处理机上运行。
* 上面的定义明显不是咱们一般所言的并发,在互联网时代,所讲的并发、高并发,一般是指并发访问。也就是在某个时间点,有多少个访问同时到来。
* 2.高并发:一般若是一个系统的日PV在千万以上,有多是一个高并发的系统。
*
* 高并发具体该关心啥?
* 1.QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求)不等于并发链接数 并发链接数是系统同时处理的请求数量
* 2.吞吐量:单位时间内处理的请求数量(一般由QPS与并发数觉定)
* 3.响应时间:从请求发出到收到响应所花费的时间。例如系统处理一个HTTP请求须要100ms,这个100ms就是系统的响应时间
* 4.PV:综合浏览量(Page View),即页面浏览量或者点击量,一个访客在24小时内访问页面的数量,同一我的浏览同一页面记一次PV
* 5.UV:独立访客,即必定时间范围内相同访客屡次访问网站,只计算为一个独立访客。
* 6.带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
* 7.日网站带宽=PV/统计时间(换算到秒)*平均页面大小(单位KB)* 8
* (总PV数*80%)/(6小时秒数*20%)=峰值每秒请求数(QPS) //80%的访问量集中在20%的时间
*
* 压力测试:利用性能测试工具 如ab 测试目标是基于URL
*
* 流量优化:防盗链处理,将恶意请求排除在外
* 前端优化:减小HTTP请求,添加异步请求,启用浏览器缓存和压缩,CDN加速,创建独立的图片服务器
* 服务端优化:页面静态化,并发处理,队列处理
* 数据库优化:数据库缓存,分库分表、分区操做,读写分离
* web服务器优化:负载均衡
*/前端
/*
* web资源防盗链
*
* 盗链:指在本身的页面上展现一些并不在本身服务器上的内容,得到他人服务器上的资源地址,绕过别人的资源展现页面,直接在本身的页面上向最终用户提供此内容
*
* 防盗链:防止别人经过一些技术手段绕过本站的资源展现页面,盗用本站的资源,让绕开本站资源展现页面的资源连接失效
* 工做原理:经过Referer(请求来源)或者签名,网站能够检测到目标网页访问的来源网页,若是是资源文件,则能够追踪到显示它的网页地址。一旦检测到来源不是本站即进行阻止或者返回指定页面
*
* 防盗链的实现:
* Referer:Nginx模块 ngx_http_referer_module用于阻挡来源非法的域名请求
* Nginx指令valid_referers,全局变量$invalid_referer
* valid_referers none|blocked|server_name|string...;
* none:"Referer"来源头部为空的状况(合法)
* blocked:"Referer"来源头部不为空,可是里面的只被代理或者防火墙删除了,这些值都不以http://或者https://开头
* server_name:来源referer包含server_name(容许源)
* 使用加密签名:使用点三方模块HttpAccessKeyModule实现Nginx防盗链
* accesskey on|off模块开关
* accesskey_hashmethod md5|sha_1签名加密方式
* accesskey_arg GET参数名称
* accesskey_signature 加密规则
*
*/web
/*
* 减小HTTP请求
* HTTP链接产生的开销 解析花费时间
* 合并图片(图片地图,css精灵),js,css
* 图片使用Base64编码减小页面请求数:采用用Base64编码方式将图片直接嵌入到网页中,而不是从外部导入
*/算法
/*
* 浏览器缓存和数据压缩
*
* 缓存分类:
* HTTP缓存模型中,若是请求成功会有三种状况
* 200 from cache:直接从本地缓存中获取响应,最快速,最省流量,由于根本没有向服务器发送请求
* 304 Not Modified:协商缓存,浏览器在本地没有命中的状况下请求头中发送必定的检验数据到服务器端,若是服务器端数据没有改变,浏览器从本地缓存响应,返回304 快速,发送的数据不多,只返回一些基本的响应头信息,数据很小,不发送实际响应体
* 200 OK:以上两种缓存都失败,服务器返回完整响应。没有用到缓存,相对最慢
*
* 本地缓存:若是浏览器认为本地缓存能够用,就不须要去请求服务器
* 相关Header:
* Pragma:HTTP1.0时代的遗留产物,该字段被设置为no-cache时,会告知浏览器禁用本地缓存,即每次都向服务器发送请求
* Expires:HTTP1.0时代用来启用本地缓存的字段,expires值对应一个形如Thu,31 Dec 2037 23:55:55 GMT 的格林威治时间,告诉浏览器缓存实现的时刻,若是还没到该时刻,标明缓存有效,无需发送请求。浏览器与服务器的时间没法保持一致,时间相差太大会影响缓存
* Cache-Control:HTTP1.1针对Expires时间不一致的解决方案,运用Cache-Control告知浏览器缓存过时的时间而不是时刻,及时具体时间不一致,也不影响缓存的管理
* no-store:禁止浏览器缓存响应
* no-cache:不容许直接使用本地缓存,先发起请求和服务器协商
* max-age=data-seconds:告知浏览器该响应本地缓存有效地最长期限,以秒为单位
*
* 优先级:Pragma>Cache-Control>Expires
*
* Last-Modified:通知浏览器资源的最后修改时间
* If-Modified-Since:获得资源的最后修改时间后,会将这个信息经过If-Modified-Since提交到服务器作检查,若是没有修改,返回304状态码
* ETag:HTTP1.1推出,文件的指纹标识符,若是文件内容修改,指纹会改变
* If-None-Match:本地缓存失效,会携带此值去请求服务器,服务端判断该资源是否改变,若是没有改变,直接使用本地缓存,返回304
*
*
*
* 缓存策略的选择:
* 不变的图像,如logo,图标等 js、css静态文件 可下载内容,媒体文件
* 建议使用协商缓存:HTML文件,常常修改的图片、js、css文件
* 不建议缓存的内容:用户的隐私内容以及常常修改的api数据接口
*
* 本地缓存配置:add_header指令:添加状态码为2XX和3XX的响应头信息
* add_header name value [always];
* 能够设置Pragma/Expires/Cache-Control,能够继承
* expires指令:通知浏览器过时时长
* expires time 为负值时 表示no cache max时为10年
*
* 协商缓存: Etag指令
*
* 前端代码和资源的压缩:图片压缩、js、css等压缩
*
*/
//$since=$_SERVER['HTTP_IF_MODIFIED_SINCE'];
//$lifetime=10;
//if(strtotime($since)+$lifetime>time()){
//
// header('HTTP/1.1 304 Not Modified');
// exit;
//}
//header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time()). ' GMT');
//
//echo time();数据库
/*
* CDN加速
* 什么是CDN:CDN的全称是Content Delivery Network,即内容分发网络
* 在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络
* CDN系统可以实时地根据网络流量和各节点的链接,负载情况以及到各用户的距离和响应时间等综合信息将用户的请求从新导向离用户最近的服务器节点上
*
* 使用CDN的优点:本地Cache加速,提升了企业站点(尤为含有大量图片和静态页面站点)的访问速度
* 跨运营商的网络加速,保证不一样网络的用户都获得良好的访问质量
* 远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器
* 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减小远程访问的带宽,分担网络流量,减轻原站点WEB服务器负载等功能
* 普遍分布的CDN节点加上节点之间的智能冗余机制,能够有效地预防黑客入侵
*
*
* CDN的工做原理:
* 传统访问:用户在浏览器输入域名发起请求-->解析域名获取服务器IP地址-->根据IP地址找到对应的服务器-->服务器响应并返回数据
* 使用CDN访问:用户发起请求-->智能DNS的解析(根据IP判断地理位置、接入网络型、选择路由最短和服务器最轻的服务器)-->取得缓存服务器IP-->把内容返回给用户(若是缓存中有)-->向源站发起请求-->将结果返回给用户-->将结果存入缓存服务器
*
* 应用场景:站点或者应用中有大量的静态资源
* 大文件下载
* 直播网站
*
* 实现:BAT等都有提供CDN服务
* 可用LVS作4层负载均衡
* 可使用apache noginx
* 使用squid反向代理,或者Nginx等的反向代理
*
*/apache
/*
* 独立图片服务器的部署
*
* 独立的必要性:分担Web副武器的I/O负载-将耗资源的图片服务分离出来,提升服务期的性能和稳定性
* 可以专门对服务器进行优化-为图片服务设置有针对性的缓存方案,减小带宽成本,提升访问速度
* 提升网站的可扩展性-经过增长图片服务器,增长图片的吞吐
*
* 采用独立域名:同一浏览器下并发链接数有限制,突破浏览器链接数的限制
* 因为cookie,对缓存不利,大部分Web cache都只缓存不带cookie的请求,致使每次图片请求都不能命中cache
*
* 独立后的问题:
* 如何进行图片上传和图片同步:
* NFS共享方式
* 利用FTP同步
*/编程
/*
* 动态语言静态化
*
* 什么是动态语言静态化:将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程 不高的页面
*
* 为何要静态化:
* 缘由:1.动态脚本一般会作逻辑运算和数据查询,访问量越大,服务器压力越大
* 2.访问量大时可能会形成CPU负载太高,数据库服务器压力过大
* 3.静态化能够减低逻辑处理压力,下降数据库服务器查询压力
*
* 静态化的实现方式:
* 使用模板引擎:可使用Smarty的缓存机制生成静态的HTML缓存文件
* 利用ob系列的函数:ob
*/api
/*
* 动态语言并发处理
*
* 进程:进程是计算机中的程序关于某数据集合上的的一次运行活动,是系统进行资源分配和调度的基本单位,是操做系统结构的基础 进程是一个“执行中的程序”
* 进程的三态模型:多道程序系统中,进程在处理器上交替运行,状态不断地发生变化
* 运行、就绪、阻塞
* 线程:线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为多线程。
* 运行、就绪、阻塞
* 协程:协程不是进程或线程,其执行过程更相似于子例程,或者说不带返回值的函数调用。
一个程序能够包含多个协程,能够对比与一个进程包含多个线程,于是下面咱们来比较协程和线程。咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程由当前协程来控制。浏览器
*
*线程与进程之间的区别:
* 1.线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有本身独立的空间地址
* 2.进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
* 3.线程是处理器调度的基本单位,但进程不是
* 4.两者均可以并发执行
* 5.每一个独立的线程有一个程序的入口,顺序执行序列和程序的出口,可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
*
* 线程与协程的区别:
* 1.一个线程能够有多个协程,一个进程也能够单独有多个协程
* 2.线程是同步机制,而协程则是异步
* 3.协程能保留上一次调用时的状态,每次过程重入时,就至关于进入上一次的调用状态
*
* 多进程与多线程
* 多进程:同一个计算机在同一时间容许系统中两个个或两个以上的进程处于运行状态,这就是多进程
* 多线程:线程就是把一个进程分为多个片断,每一个进程占据一个独立的片断
*
*
* php并发编程实践:
* Swoole:Swoole 使用纯 C 语言编写,提供了 PHP 语言的异步多线程服务器,异步 TCP/UDP 网络客户端,异步 MySQL,异步 Redis,数据库链接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
除了异步 IO 的支持以外,Swoole 为 PHP 多进程的模式设计了多个并发数据结构和IPC通讯机制,能够大大简化多进程并发编程的工做。其中包括了并发原子计数器,并发 HashTable,Channel,Lock,进程间通讯IPC等丰富的功能特性。
Swoole2.0 支持了相似 Go 语言的协程,可使用彻底同步的代码实现异步程序。PHP 代码无需额外增长任何关键词,底层自动进行协程调度,实现异步。
*/
/* * 数据库缓存 * * 什么是数据库缓存:MySQL等一些常见的关系数据库的数据存储在磁盘中,在高并发场景下,业务应用对MySQL产生的增、删、改、查的操做形成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据库应运而生 * 为何要使用缓存:缓存数据是为了减小客户端访问数据库服务器进行数据查询 * * MySQL查询缓存:query_cache_type * * 使用Memcache缓存查询数据: * memcache:分布式的高速缓存系统 * 工做原理: * 工做流程: * * 使用Redis缓存: * Redis: * 工做原理: * 工做流程: * * Redis与Memcache * 性能相差不大 * Redis在2.0版本后增长了本身的VM特性,突破物理内存限制,Memcache能够修改最大可用内存,采用LRU算法 * Redis,依赖客户端来实现分布式读写 * Memcache自己没有数据冗余机制 * Redis支持(快照、AOF),依赖快照进行持久化,aof加强了可靠性的同时,对性能有所影响 * */