PHP面试之二:高并发与大数据
web資源防盜鏈
- 盜鏈?zhǔn)鞘裁?#xff1f; 為什么要防?
在自己頁面上顯示一些不是自己服務(wù)器的資源(圖片、音頻、視頻、css、js等)
由于別人盜鏈你的資源會加重你的服務(wù)器負(fù)擔(dān),所以我們需要防止
可能會影響統(tǒng)計(jì)
- 防盜鏈?zhǔn)鞘裁?#xff1f; 有哪幾種方式?
防止別人通過一些技術(shù)手段繞過本站的資源展示頁,盜用本站資源,讓繞開本站資源展示頁面的資源鏈接失效
大大減輕服務(wù)器壓力
- 防盜鏈的工作原理
通過Referer,服務(wù)器可以檢測到訪問目標(biāo)資源的來源網(wǎng)站,如果是資源文件,則可以跟蹤到顯示它的網(wǎng)頁地址。一旦檢測到來源網(wǎng)站不是本站進(jìn)行阻止
通過簽名,根據(jù)計(jì)算簽名的方式,判斷請求是否合法,如果合法則顯示,否則返回錯(cuò)誤信息
- Referer實(shí)現(xiàn)
以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呢?因?yàn)槿绻ㄟ^瀏覽器直接訪問資源,referer就是為空,所以這種方式不能徹底阻擋住盜鏈。
- 加密簽名
以Nginx為例,前提加載第三方模塊HttpAccessKeyModule實(shí)現(xiàn)防盜鏈
location ~* \.(gif|jpg|png|webp)$ {accesskey on;accesskey_hashmethod md5;accesskey_arg key;accesskey_signature "mysrc$remote_addr"; }減少HTTP請求次數(shù)
- 發(fā)現(xiàn)問題
80~90%是花費(fèi)在頁面引用控件的加載上,只有10~20%是花費(fèi)在文檔的加載上
HTTP/1.1協(xié)議規(guī)定請求只能串行發(fā)送,換句話就是100個(gè)請求,只能一個(gè)一個(gè)發(fā)送,上一個(gè)請求完成才能進(jìn)行下一個(gè)請求
- 如何改善?
減少引用控件數(shù)量,從而達(dá)到減少HTTP請求次數(shù)
- 如何實(shí)現(xiàn)減少請求?
1、圖片地圖
原理:把多張圖片合成一張,再使用<map>標(biāo)簽來實(shí)現(xiàn)對圖片上不同區(qū)域的鏈接
<img src="img/planets.gif" width="145" height="126" alt="Planets" usemap="#planetmap"> <map name="planetmap"><area shape="rect" coords="0,0,82,126" alt="Sun" href="sun.htm"><area shape="circle" coords="90,58,3" alt="Mercury" href="mercur.htm"><area shape="circle" coords="124,58,8" alt="Venus" href="venus.htm"> </map>圖片地圖
2、CSS Sprites(雪碧圖)
原理:合拼圖片,再使用css的background-image和background-position來指定顯示元素
CSS Sprites與圖片地圖性能差不多,但CSS Sprites更加簡單靈活CSS Sprites
3、合并JS與CSS文件
加載一個(gè)JS文件比加載多個(gè)JS文件要快
一般會使用前端自動構(gòu)建工具打包合并4、圖片使用base64編碼
注意:圖片base64除了可以使用在<img>中,還可以使用在css的background-image中
CDN加速
- 什么是CDN加速?
CDN 就是內(nèi)容分發(fā)網(wǎng)絡(luò),在各處放置服務(wù)器來構(gòu)成一層智能虛擬網(wǎng)絡(luò),此處服務(wù)器稱之為節(jié)點(diǎn)服務(wù)器。所謂智能就是會自動根據(jù)用戶請求信息把請求重新分配到離客戶端最近的服務(wù)器。
CDN的作用: 解決由于服務(wù)端與客戶端所在區(qū)域的不同,導(dǎo)致影響數(shù)據(jù)傳輸速度和穩(wěn)定性問題,一句話總結(jié)就是讓數(shù)據(jù)傳輸更快更穩(wěn)定。
- CDN有什么優(yōu)勢?
1、智能Cache加速,提高企業(yè)站點(diǎn)的訪問速度(含大量圖片或靜態(tài)頁面最適合,因?yàn)镃DN相當(dāng)于是服務(wù)器的一個(gè)鏡像)
2、跨運(yùn)營商的網(wǎng)絡(luò)加速,保證不同網(wǎng)絡(luò)的用戶都能得到很好的訪問速度
3、加速用戶遠(yuǎn)程訪問服務(wù)器,根據(jù)DNS負(fù)載均衡技術(shù)自動智能選擇Catch服務(wù)器
4、自動生成遠(yuǎn)程服務(wù)器的鏡像(Catch服務(wù)器),加速訪問速度,減輕Web服務(wù)器的負(fù)擔(dān),分擔(dān)流量
- CDN的工作原理是什么?
- CDN適用場景有哪些?
1、網(wǎng)站或應(yīng)用中大量靜態(tài)資源的加速分發(fā) (例如:css/js/圖片等)
2、大文件下載
3、直播網(wǎng)站
- CDN如何實(shí)現(xiàn)?
瀏覽器緩存
高并發(fā)下只能通過提高服務(wù)器負(fù)載來解決? NO,流量、前端、服務(wù)器、數(shù)據(jù)庫
緩存只能是數(shù)據(jù)庫緩存嗎? NO,還有瀏覽器緩存
- HTTP緩存分類(2種)
1.200 OK (from memory cache) 直接從本地緩存中獲取響應(yīng),最快速、最省流量,因?yàn)闆]有向服務(wù)器發(fā)送請求
2.304 Not Modified 協(xié)商緩存,瀏覽器在本地沒有命中的情況下,請求頭中會發(fā)送一定的校驗(yàn)數(shù)據(jù)到服務(wù)器。如果服務(wù)端數(shù)據(jù)沒有改變,服務(wù)端直接響應(yīng)(通知瀏覽器從本地緩存獲取),返回304(快速、發(fā)送數(shù)據(jù)很少,只返回最基本的響應(yīng)頭,不發(fā)送響應(yīng)體)
PS: 以上兩種緩存全部失敗,服務(wù)器返回完整響應(yīng)體(200 OK),沒有用到緩存,速度最慢
- 與瀏覽器本地緩存相關(guān)的header
Pragma
Cache-Control
Expires
前端代碼和資源壓縮優(yōu)化
讓資源文件更小,加快文件在網(wǎng)絡(luò)中傳輸,讓網(wǎng)頁更快的展示,降低流量和寬帶開銷
- 壓縮方式
JS、CSS、HTML、圖片壓縮和Gzip壓縮
- JS代碼壓縮
在線壓縮工具
- CSS代碼壓縮
在線壓縮工具
- HTML代碼壓縮(不推薦,鎮(zhèn)用)
- 圖片(JPG、PNG)壓縮
壓縮工具:tinypng/JpegMini/ImageOptim
- Gzip壓縮
Gzip壓縮是Web服務(wù)器對純文本文件(JS/CSS/XML/HTML)進(jìn)行壓縮
注意:千萬不要對圖片進(jìn)行Gzip壓縮
動態(tài)語言靜態(tài)化
將現(xiàn)代動態(tài)語言的邏輯代碼生成為靜態(tài)HTML文件(靜態(tài)化實(shí)際作用:緩存成一個(gè)html文件),再次訪問時(shí)就會重定向到靜態(tài)文件
- 適用場景
對實(shí)時(shí)性要求不高的頁面
- 為什么要使用靜態(tài)化?
解決高并發(fā),減輕Web服務(wù)器和數(shù)據(jù)庫服務(wù)器壓力
- 靜態(tài)化實(shí)現(xiàn)方式有幾種?
1、使用Smarty模板引擎
2、使用ob系列函數(shù)
- 使用Smarty模板引擎
- 使用ob系列函數(shù)(重點(diǎn),實(shí)現(xiàn)靜態(tài)化基礎(chǔ))
動態(tài)語言的并發(fā)處理
- 什么是進(jìn)程?什么是線程?什么是協(xié)程?
進(jìn)程:是一個(gè)“執(zhí)行中的程序”,程序不執(zhí)行就不會產(chǎn)生進(jìn)程。一個(gè)執(zhí)行中的程序至少會產(chǎn)生一個(gè)進(jìn)程,當(dāng)進(jìn)程獲得了處理機(jī)時(shí)才會從就緒狀態(tài)變?yōu)檫\(yùn)行狀態(tài),處理機(jī)不斷切換地分配到每個(gè)進(jìn)程中。決定同時(shí)有多少個(gè)進(jìn)程處于運(yùn)行狀態(tài)的是處理器數(shù)量(CPU核數(shù))
進(jìn)程的三態(tài)模型:多個(gè)程序在系統(tǒng)中運(yùn)行時(shí),進(jìn)程在處理機(jī)中交替運(yùn)行,狀態(tài)在不斷切換。 三態(tài)分別是:就緒、運(yùn)行、阻塞進(jìn)程的五態(tài)模型(在三態(tài)的基礎(chǔ)上發(fā)展而來):新建態(tài)、運(yùn)行態(tài)、終止態(tài)、就緒態(tài)、等待態(tài)
線程:稱之為輕量級的進(jìn)程,程序執(zhí)行流的最小單元。線程依賴于進(jìn)程(一個(gè)進(jìn)程可以有多個(gè)線程),線程不擁有系統(tǒng)資源。與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程擁有的全部資源;一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)執(zhí)行。一個(gè)進(jìn)程下有多個(gè)線程來完成不同的工作稱之為多線程。(一個(gè)進(jìn)程下至少會有一個(gè)線程)
線程由來:由于用戶并發(fā)請求,為每個(gè)請求都創(chuàng)建一個(gè)進(jìn)程顯然太浪費(fèi)系統(tǒng)資源和影響響應(yīng)用戶請求的效率,所以引進(jìn)線程的概念。協(xié)程:是一種用戶態(tài)輕量級的線程。
//協(xié)程與線程的區(qū)別 1、協(xié)程是由用戶自己調(diào)度,而線程是用系統(tǒng)調(diào)度 2、協(xié)程是異步的,而進(jìn)程線程是同步的 3、一個(gè)線程可以有多個(gè)協(xié)程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程 4、協(xié)程會保留上一次調(diào)用的狀態(tài)- 什么是多線程?什么是多進(jìn)程?
多進(jìn)程:2個(gè)或2個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài),進(jìn)程間通信不方便
多線程:把一個(gè)進(jìn)程分為很多片,每一片都是一個(gè)獨(dú)立的流程,線程間可以互相通訊
- 同步阻塞模型
- 異步非阻塞模型
- PHP并發(fā)編程實(shí)戰(zhàn)
1.使用swoole擴(kuò)展
2.使用消息隊(duì)列
3.接口的并發(fā)請求
curl_multi_init()數(shù)據(jù)緩存
- 什么是數(shù)據(jù)緩存?
作用:
1、極大地緩解數(shù)據(jù)庫服務(wù)器的壓力
2、提高數(shù)據(jù)的響應(yīng)速度
緩存形式有:內(nèi)存緩存、文件緩存
推薦使用內(nèi)存緩存
- 為什么要使用數(shù)據(jù)緩存?(答案如上)
第一次訪問:
再次訪問:
- 如何使用Mysql查詢緩存?
- 如何使用Memcache緩存?
- 如何使用redis緩存?
Web服務(wù)器負(fù)載均衡
- 實(shí)現(xiàn)方式
1、七層負(fù)載均衡(Nginx)
2、四層負(fù)載均衡(LVS/硬件設(shè)備)
- 七層負(fù)載均衡
基于URL等應(yīng)用層信息實(shí)現(xiàn)負(fù)載均衡
// 一般使用Nginx來實(shí)現(xiàn) 功能強(qiáng)大、性能卓越、運(yùn)行穩(wěn)定 配置簡單靈活 上傳文件使用異步模式 多種分發(fā)策略 自動剔除不正常工作設(shè)備- Nginx負(fù)載均衡策略
內(nèi)置
加權(quán)輪詢、IP Hash外置
fair策略、通用Hash、一致性Hash- Nginx配置負(fù)載均衡
- 四層負(fù)載均衡
有2種方式實(shí)現(xiàn):
1、LVS
2、硬件設(shè)備
MySQL數(shù)據(jù)庫優(yōu)化
- 優(yōu)化方向
字段數(shù)據(jù)類型優(yōu)化
tinyint/smallint/int/bigint的選擇 char/varchar enum 固定分類 IP地址數(shù)據(jù)如何存? 答案:把IP地址轉(zhuǎn)整型類型存儲索引
SQL語句優(yōu)化
存儲引擎優(yōu)化
表結(jié)構(gòu)設(shè)計(jì)優(yōu)化
數(shù)據(jù)庫服務(wù)器架構(gòu)優(yōu)化
- 列表項(xiàng)目
總結(jié)
以上是生活随笔為你收集整理的PHP面试之二:高并发与大数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux用户管理(五)Linux系统的
- 下一篇: php curl