1. 程式人生 > >PHP高併發與大資料

PHP高併發與大資料

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、圖片地圖

原理把多張圖片合成一張,再使用<map>標籤來實現對圖片上不同區域的連結

 
<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檔案

載入一個JS檔案比載入多個JS檔案要快

 
一般會使用前端自動構建工具打包合併

4、圖片使用base64編碼

注意:圖片base64除了可以使用在<img>中,還可以使用在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語句優化


儲存引擎優化


表結構設計優化


資料庫伺服器架構優化

  • 列表專案