资讯专栏INFORMATION COLUMN

PHP面试之二:高并发与大数据

Ashin / 1608人阅读

摘要:三态分别是就绪运行阻塞进程的五态模型在三态的基础上发展而来新建态运行态终止态就绪态等待态线程称之为轻量级的进程,程序执行流的最小单元。一个进程下有多个线程来完成不同的工作称之为多线程。

web资源防盗链

盗链是什么? 为什么要防?

在自己页面上显示一些不是自己服务器的资源图片音频视频cssjs等)
由于别人盗链你的资源会加重你的服务器负担,所以我们需要防止
可能会影响统计

防盗链是什么? 有哪几种方式?

防止别人通过一些技术手段绕过本站的资源展示页,盗用本站资源,让绕开本站资源展示页面的资源链接失效
大大减轻服务器压力

1、Referer (易伪造referer,安全性低)
2、加密签名 (安全性高)

防盗链的工作原理

通过Referer,服务器可以检测到访问目标资源的来源网站,如果是资源文件,则可以跟踪到显示它的网页地址。一旦检测到来源网站不是本站进行阻止

通过签名,根据计算签名的方式,判断请求是否合法,如果合法则显示,否则返回错误信息

Referer实现

Nginx为例,前提加载ngx_http_referer_module模块

//指令valid_referers  全局invalid_referer
location ~* .(gif|jpg|png|webp)$ {
   valid_referers none blocked domain.com *.domain.com ;
   if ($invalid_referer) {
        return 403;
        #rewrite ^/ http://www.domain.com/403.jpg;
   }
}

注意:为什么要none呢?因为如果通过浏览器直接访问资源,referer就是为空,所以这种方式不能彻底阻挡住盗链。

加密签名

Nginx为例,前提加载第三方模块HttpAccessKeyModule实现防盗链

location ~* .(gif|jpg|png|webp)$ {
    accesskey on;
    accesskey_hashmethod md5;
    accesskey_arg key;
    accesskey_signature "mysrc$remote_addr";
}
减少HTTP请求次数

发现问题

80~90%是花费在页面引用控件的加载上,只有10~20%是花费在文档的加载上
HTTP/1.1协议规定请求只能串行发送,换句话就是100个请求,只能一个一个发送,上一个请求完成才能进行下一个请求

如何改善?

减少引用控件数量,从而达到减少HTTP请求次数

如何实现减少请求?

1、图片地图

原理把多张图片合成一张,再使用标签来实现对图片上不同区域的链接

Planets

  Sun
  Mercury
  Venus

图片地图

2、CSS Sprites(雪碧图)

原理合拼图片,再使用css的background-image和background-position来指定显示元素

CSS Sprites与图片地图性能差不多,但CSS Sprites更加简单灵活

CSS Sprites

3、合并JS与CSS文件

加载一个JS文件比加载多个JS文件要快

一般会使用前端自动构建工具打包合并

4、图片使用base64编码

注意:图片base64除了可以使用在中,还可以使用在css的background-image中

CDN加速

什么是CDN加速?

CDN 就是内容分发网络,在各处放置服务器来构成一层智能虚拟网络,此处服务器称之为节点服务器。所谓智能就是会自动根据用户请求信息把请求重新分配到离客户端最近的服务器。

CDN的作用: 解决由于服务端与客户端所在区域的不同,导致影响数据传输速度和稳定性问题,一句话总结就是让数据传输更快更稳定

CDN有什么优势?

1、智能Cache加速,提高企业站点的访问速度(含大量图片或静态页面最适合,因为CDN相当于是服务器的一个镜像)
2、跨运营商的网络加速,保证不同网络的用户都能得到很好的访问速度
3、加速用户远程访问服务器,根据DNS负载均衡技术自动智能选择Catch服务器
4、自动生成远程服务器的镜像(Catch服务器),加速访问速度,减轻Web服务器的负担,分担流量

CDN的工作原理是什么?


CDN适用场景有哪些?

1、网站或应用中大量静态资源的加速分发 (例如:css/js/图片等)
2、大文件下载
3、直播网站

CDN如何实现?

浏览器缓存

高并发下只能通过提高服务器负载来解决? NO,流量、前端、服务器、数据库
缓存只能是数据库缓存吗? NO,还有浏览器缓存

HTTP缓存分类(2种)

1.200 OK (from memory cache) 直接从本地缓存中获取响应,最快速、最省流量,因为没有向服务器发送请求


2.304 Not Modified 协商缓存,浏览器在本地没有命中的情况下,请求头中会发送一定的校验数据到服务器。如果服务端数据没有改变,服务端直接响应(通知浏览器从本地缓存获取),返回304(快速、发送数据很少,只返回最基本的响应头,不发送响应体)


PS: 以上两种缓存全部失败,服务器返回完整响应体(200 OK),没有用到缓存,速度最慢

浏览器本地缓存相关的header

Pragma


Cache-Control


Expires

前端代码和资源压缩优化

让资源文件更小,加快文件在网络中传输,让网页更快的展示,降低流量和宽带开销

压缩方式

JS、CSS、HTML、图片压缩和Gzip压缩

JS代码压缩

去除一些多余的空格和回车,替换长变量名,简化一些代码写法
压缩工具:在线版和安装版

在线压缩工具

CSS代码压缩

与JS压缩原理一样,去除空白符、注释和优化一下语义化

在线压缩工具

HTML代码压缩(不推荐,镇用)

不推荐使用,因为会破坏代码结构。

图片(JPG、PNG)压缩

压缩工具:tinypng/JpegMini/ImageOptim

Gzip压缩

Gzip压缩是Web服务器对纯文本文件(JS/CSS/XML/HTML)进行压缩
注意:千万不要对图片进行Gzip压缩

//以Nginx为例

# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明,推荐6
gzip_comp_level 6;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6].";
# 压缩存储的缓冲
gzip_buffers 16 64k;
# 开启压缩的http版本
gzip_http_version 1.1;
动态语言静态化

将现代动态语言的逻辑代码生成为静态HTML文件(静态化实际作用:缓存成一个html文件),再次访问时就会重定向到静态文件

适用场景

对实时性要求不高的页面

为什么要使用静态化?

解决高并发,减轻Web服务器和数据库服务器压力

静态化实现方式有几种?

1、使用Smarty模板引擎
2、使用ob系列函数

使用Smarty模板引擎

//缓存存放目录
$smarty->cache_dir=$ROOT."/cache"; 
//开启缓存
$smarty->caching=true; 
//缓存过期时间
$smarty->cache_lifetime=3600;
//加载模板
$smarty->display();
//清除所有缓存文件
$smarty->clearAllCache();
//清除特定模板的缓存
$smarty->clearCache("index.tpl");

使用ob系列函数(重点,实现静态化基础)

//开启输出缓冲区
ob_start(); 
//获取输出缓冲区内容
ob_get_contents();
//清空(擦掉)输出缓冲区
ob_clean();
//送出输出缓冲区内容并关闭缓冲
ob_end_flush();
//得到当前缓冲区的内容并删除输出缓冲区
ob_get_clean();
动态语言的并发处理

什么是进程?什么是线程?什么是协程?

进程:是一个“执行中的程序”,程序不执行就不会产生进程。一个执行中的程序至少会产生一个进程,当进程获得了处理机时才会从就绪状态变为运行状态,处理机不断切换地分配到每个进程中。决定同时有多少个进程处于运行状态的是处理器数量(CPU核数)

进程的三态模型:多个程序在系统中运行时,进程在处理机中交替运行,状态在不断切换。
三态分别是:就绪、运行、阻塞

进程的五态模型(在三态的基础上发展而来):新建态、运行态、终止态、就绪态、等待态

线程:称之为轻量级的进程,程序执行流的最小单元。线程依赖于进程(一个进程可以有多个线程),线程不拥有系统资源。与同属一个进程的其他线程共享进程拥有的全部资源一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。一个进程下有多个线程来完成不同的工作称之为多线程。(一个进程下至少会有一个线程)

线程由来:由于用户并发请求,为每个请求都创建一个进程显然太浪费系统资源和影响响应用户请求的效率,所以引进线程的概念。

协程:是一种用户态轻量级的线程。

//协程与线程的区别
1、协程是由用户自己调度,而线程是用系统调度
2、协程是异步的,而进程线程是同步的
3、一个线程可以有多个协程,一个进程也可以多带带拥有多个协程
4、协程会保留上一次调用的状态

什么是多线程?什么是多进程?

多进程:2个或2个以上的进程处于运行状态,进程间通信不方便


多线程:把一个进程分为很多片,每一片都是一个独立的流程,线程间可以互相通讯

同步阻塞模型

异步非阻塞模型

PHP并发编程实战

1.使用swoole扩展


2.使用消息队列


3.接口的并发请求

curl_multi_init()
数据缓存

什么是数据缓存?

传统关系型数据库都是把数据存储到硬盘中,在高并发情况下,对数据库服务器会造成巨大压力(巨大IO操作),为了解决此问题,数据缓存由此而生!

作用:
1、极大地缓解数据库服务器的压力
2、提高数据的响应速度


缓存形式有:内存缓存、文件缓存
推荐使用内存缓存

为什么要使用数据缓存?(答案如上)

第一次访问:

再次访问:

如何使用Mysql查询缓存?

如何使用Memcache缓存?

如何使用redis缓存?

Web服务器负载均衡

实现方式

1、七层负载均衡(Nginx)
2、四层负载均衡(LVS/硬件设备)

七层负载均衡

基于URL等应用层信息实现负载均衡

// 一般使用Nginx来实现
功能强大、性能卓越、运行稳定
配置简单灵活
上传文件使用异步模式
多种分发策略
自动剔除不正常工作设备

Nginx负载均衡策略

内置

加权轮询、IP Hash

外置

fair策略、通用Hash、一致性Hash

Nginx配置负载均衡

http{
    upstream cluster{
        server srv1;
        server srv2;
        server srv3;
    }
    server{
        listen 80;
        location / {
            proxy_pass http://cluster;
        }
    }
}

四层负载均衡

有2种方式实现:
1、LVS
2、硬件设备

LVS负载均衡的三种方式:NAT、DR和TUN

硬件设备:通过报文中的目标地址和端口,再加上负载均衡设备的服务器选择方式,决定最终选择的内部服务器
MySQL数据库优化

优化方向

字段数据类型优化

tinyint/smallint/int/bigint的选择
char/varchar
enum 固定分类
IP地址数据如何存?
答案:把IP地址转整型类型存储

索引


SQL语句优化


存储引擎优化


表结构设计优化


数据库服务器架构优化

列表项目

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30631.html

相关文章

  • 我的PHP面试

    摘要:因为公司目前扩招个人书写的自己比较看重的个人技能点,因为本公司业务发展小说站,在线阅读,而且并发量和数据量是比较大的,所以会提出一些并发的东西。和的原理,以及在分布式应用中出现的问题和解决方案我们就做了分布式和的区别,各自的优点和缺点。 因为公司目前扩招PHP,个人书写的自己比较看重的个人技能点,因为本公司业务发展小说站,在线阅读,而且并发量和数据量是比较大的,所以会提出一些并发的东西...

    renweihub 评论0 收藏0
  • PHP 设计模式之二——工厂模式

    摘要:连接邮件服务器的类可以连接邮件服务器的方法有,此时可以写一个工厂类负责实例化这几种连接方法,如果某一天对方增加了连接方法,那么直接在工厂类里做相应的修改即可。扩展性高,如果想增加一个产品,只要扩展一个工厂类或者是修改工厂的生产过程即可。 定义 工厂模式的使用频率比较高。它的定义为:定义一个类,该类主要负责系统的去实例化一些其它的类。通俗点说就是,你告诉我你需要哪个类的实例即可,其它的你...

    cc17 评论0 收藏0
  • 从小白程序员一路晋升为大厂级技术专家我看过哪些书籍?(建议收藏)

    摘要:大家好,我是冰河有句话叫做投资啥都不如投资自己的回报率高。马上就十一国庆假期了,给小伙伴们分享下,从小白程序员到大厂高级技术专家我看过哪些技术类书籍。 大家好,我是...

    sf_wangchong 评论0 收藏0
  • PHP 基于laravel框架获取微博数据之二 用户数据的使用

    摘要:以大量微博用户数据为基础可建立数据模型。当前微博除了用户自己,其他人是不能查看该用户所有粉丝数据的。 项目地址:https://github.com/daweilang/... 开始抓取微博数据的时候,只是想获得一条热门微博下的所有评论,因为里面有不少图片广告,所以想试试能不能分析出热门微博评论里的异常用户。 使用PHP的Laravel框架后,通过队列、命令等各种功能,最后构架了一套完...

    Sleepy 评论0 收藏0

发表评论

0条评论

Ashin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<