PHP高并發(fā)處理方案

web資源防盜鏈

盜鏈是什么,為什么要防什湘?

  1. 在自己頁面上顯示一些不是自己服務(wù)器的資源(圖片闽撤、音頻脯颜、視頻闸餐、css、js等)
    由于別人盜鏈你的資源會加重你的服務(wù)器負擔(dān)舍沙,所以我們需要防止,而且會影響統(tǒng)計

防盜鏈是什么场勤? 有哪幾種方式?

  • 防止別人通過一些技術(shù)手段繞過本站的資源展示頁哈街,盜用本站資源骚秦,讓繞開本站資源展示頁面的資源鏈接失效 大大減輕服務(wù)器壓力
    1、Referer (易偽造referer,安全性低)
    2胞得、加密簽名 (安全性高)

防盜鏈的工作原理

  • 通過Referer,服務(wù)器可以檢測到訪問目標資源的來源網(wǎng)站屹电,如果是資源文件阶剑,則可以跟蹤到顯示它的網(wǎng)頁地址跃巡。一旦檢測到來源網(wǎng)站不是本站進行阻止
  1. Referer實現(xiàn) 以Nginx為例,前提加載ngx_http_referer_module模塊,注意:為什么要none呢牧愁?因為如果通過瀏覽器直接訪問資源素邪,referer就是為空,所以這種方式不能徹底阻擋住盜鏈猪半。
location ~* \.(gif|jpg|png|webp)$ {
#指令valid_referers  全局invalid_referer
   valid_referers none blocked domain.com *.domain.com ;
   if ($invalid_referer) {
        return 403;
        #rewrite ^/ http://www.domain.com/403.jpg;
   }
}
  1. 通過簽名兔朦,根據(jù)計算簽名的方式,判斷請求是否合法办龄,如果合法則顯示俐填,否則返回錯誤信息
    加密簽名
#以Nginx為例,前提加載第三方模塊HttpAccessKeyModule實現(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)問題

8090%是花費在頁面引用控件的加載上痕鳍,只有1020%是花費在文檔的加載上,HTTP/1.1協(xié)議規(guī)定請求只能串行發(fā)送诗赌,換句話就是100個請求,只能一個一個發(fā)送,上一個請求完成才能進行下一個請求

如何改善?

  • 減少引用控件數(shù)量,從而達到減少HTTP請求次數(shù)
  1. CSS Sprites(雪碧圖)
    原理:合拼圖片,再使用css的background-image和background-position來指定顯示元素 CSS Sprites與圖片地圖性能差不多,但CSS Sprites更加簡單靈活
  2. 合并JS與CSS文件:加載一個JS文件比加載多個JS文件要快,一般會使用前端自動構(gòu)建工具打包合并
  3. 圖片使用base64編碼
    注意:圖片base64除了可以使用在<img>中,還可以使用在css的background-image中
  4. 圖片地圖 把多張圖片合成一張鞭缭,再使用<map>標簽來實現(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>

CDN加速

  • CDN 就是內(nèi)容分發(fā)網(wǎng)絡(luò)仑濒,在各處放置服務(wù)器來構(gòu)成一層智能虛擬網(wǎng)絡(luò)矗烛,此處服務(wù)器稱之為節(jié)點服務(wù)器涣旨。所謂智能就是會自動根據(jù)用戶請求信息把請求重新分配到離客戶端最近的服務(wù)器攒霹。
  • CDN的作用: 解決由于服務(wù)端與客戶端所在區(qū)域的不同抠刺,導(dǎo)致影響數(shù)據(jù)傳輸速度和穩(wěn)定性問題罕容,一句話總結(jié)就是讓數(shù)據(jù)傳輸更快更穩(wěn)定。

CDN有什么優(yōu)勢?

1产弹、智能Cache加速匾嘱,提高企業(yè)站點的訪問速度(含大量圖片或靜態(tài)頁面最適合,因為CDN相當于是服務(wù)器的一個鏡像)
2烘豌、跨運營商的網(wǎng)絡(luò)加速靡挥,保證不同網(wǎng)絡(luò)的用戶都能得到很好的訪問速度
3、加速用戶遠程訪問服務(wù)器牺六,根據(jù)DNS負載均衡技術(shù)自動智能選擇Catch服務(wù)器
4簿训、自動生成遠程服務(wù)器的鏡像(Catch服務(wù)器)雕薪,加速訪問速度,減輕Web服務(wù)器的負擔(dān),分擔(dān)流量

CDN的工作原理是什么商模?

CDN適用場景有哪些践盼?

  • 網(wǎng)站或應(yīng)用中大量靜態(tài)資源的加速分發(fā) (例如:css/js/圖片等)
  • 大文件下載
  • 直播網(wǎng)站

CDN如何實現(xiàn)?

瀏覽器緩存

  • 高并發(fā)下只能通過提高服務(wù)器負載來解決? NO,流量、前端、服務(wù)器篡撵、數(shù)據(jù)庫
  • 緩存只能是數(shù)據(jù)庫緩存嗎? NO,還有瀏覽器緩存
  • HTTP緩存分類(2種)
    1. 200 OK (from memory cache) 直接從本地緩存中獲取響應(yīng)泳炉,最快速古拴、最省流量崇众,因為沒有向服務(wù)器發(fā)送請求
    2. 304 Not Modified 協(xié)商緩存,瀏覽器在本地沒有命中的情況下幔睬,請求頭中會發(fā)送一定的校驗數(shù)據(jù)到服務(wù)器眯漩。如果服務(wù)端數(shù)據(jù)沒有改變,服務(wù)端直接響應(yīng)(通知瀏覽器從本地緩存獲嚷槎ァ)赦抖,返回304(快速、發(fā)送數(shù)據(jù)很少辅肾,只返回最基本的響應(yīng)頭队萤,不發(fā)送響應(yīng)體)
    3. 以上兩種緩存全部失敗,服務(wù)器返回完整響應(yīng)體(200 OK)矫钓,沒有用到緩存浮禾,速度最慢
      與瀏覽器本地緩存相關(guān)的header Pragma Cache-Control Expires
    4. 前端代碼和資源壓縮優(yōu)化 讓資源文件更小,加快文件在網(wǎng)絡(luò)中傳輸份汗,讓網(wǎng)頁更快的展示盈电,降低流量和寬帶開銷

壓縮方式

  • JS、CSS杯活、HTML匆帚、圖片壓縮和Gzip壓縮
  • JS代碼壓縮
  • 去除一些多余的空格和回車,替換長變量名旁钧,簡化一些代碼寫法;壓縮工具:在線版和安裝版在線壓縮工具
  • CSS代碼壓縮,與JS壓縮原理一樣吸重,去除空白符互拾、注釋和優(yōu)化一下語義化
  • HTML代碼壓縮(不推薦,鎮(zhèn)用) 不推薦使用嚎幸,因為會破壞代碼結(jié)構(gòu)颜矿。
  • 圖片(JPG、PNG)壓縮
    壓縮工具:tinypng/JpegMini/ImageOptim
  • Gzip壓縮 Gzip壓縮是Web服務(wù)器對純文本文件(JS/CSS/XML/HTML)進行壓縮
    注意:千萬不要對圖片進行Gzip壓縮
    //以Nginx為例
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小文件嫉晶,小于設(shè)置值的文件將不會壓縮
gzip_min_length 1k;
# gzip 壓縮級別骑疆,1-10,數(shù)字越大壓縮的越好替废,也越占用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;

動態(tài)語言靜態(tài)化

  • 將現(xiàn)代動態(tài)語言的邏輯代碼生成為靜態(tài)HTML文件(靜態(tài)化實際作用:緩存成一個html文件)冷守,再次訪問時就會重定向到靜態(tài)文件
  • 適用場景
    1. 對實時性要求不高的頁面
  • 為什么要使用靜態(tài)化?
    1. 解決高并發(fā)惊科,減輕Web服務(wù)器和數(shù)據(jù)庫服務(wù)器壓力
  • 靜態(tài)化實現(xiàn)方式有幾種拍摇?
    1. 使用Smarty模板引擎
    2. 使用ob系列函數(shù)
    3. 使用Smarty模板引擎
//緩存存放目錄
$smarty->cache_dir=$ROOT.'/cache'; 
//開啟緩存
$smarty->caching=true; 
//緩存過期時間
$smarty->cache_lifetime=3600;
//加載模板
$smarty->display();
//清除所有緩存文件
$smarty->clearAllCache();
//清除特定模板的緩存
$smarty->clearCache('index.tpl');
使用ob系列函數(shù)(重點,實現(xiàn)靜態(tài)化基礎(chǔ))
//開啟輸出緩沖區(qū)
ob_start(); 
//獲取輸出緩沖區(qū)內(nèi)容
ob_get_contents();
//清空(擦掉)輸出緩沖區(qū)
ob_clean();
//送出輸出緩沖區(qū)內(nèi)容并關(guān)閉緩沖
ob_end_flush();
//得到當前緩沖區(qū)的內(nèi)容并刪除輸出緩沖區(qū)
ob_get_clean();

動態(tài)語言的并發(fā)處理

  • 什么是進程译断?什么是線程授翻?什么是協(xié)程?
    1. 進程:是一個“執(zhí)行中的程序”孙咪,程序不執(zhí)行就不會產(chǎn)生進程堪唐。一個執(zhí)行中的程序至少會產(chǎn)生一個進程,當進程獲得了處理機時才會從就緒狀態(tài)變?yōu)檫\行狀態(tài)翎蹈,處理機不斷切換地分配到每個進程中淮菠。決定同時有多少個進程處于運行狀態(tài)的是處理器數(shù)量(CPU核數(shù))進程的三態(tài)模型:多個程序在系統(tǒng)中運行時,進程在處理機中交替運行荤堪,狀態(tài)在不斷切換合陵。三態(tài)分別是:就緒、運行澄阳、阻塞
    2. 進程的五態(tài)模型(在三態(tài)的基礎(chǔ)上發(fā)展而來):新建態(tài)拥知、運行態(tài)、終止態(tài)碎赢、就緒態(tài)低剔、等待態(tài)
    3. 線程:之為輕量級的進程,程序執(zhí)行流的最小單元。線程依賴于進程(一個進程可以有多個線程)襟齿,線程不擁有系統(tǒng)資源姻锁。與同屬一個進程的其他線程共享進程擁有的全部資源;一個線程可以創(chuàng)建和撤銷另一個線程猜欺,同一個進程中的多個線程可以并發(fā)執(zhí)行位隶。一個進程下有多個線程來完成不同的工作稱之為多線程。(一個進程下至少會有一個線程)
    4. 線程由來:由于用戶并發(fā)請求开皿,為每個請求都創(chuàng)建一個進程顯然太浪費系統(tǒng)資源和影響響應(yīng)用戶請求的效率涧黄,所以引進線程的概念。
    5. 協(xié)程:是一種用戶態(tài)輕量級的線程副瀑。
  • 協(xié)程與線程的區(qū)別
    1. 協(xié)程是由用戶自己調(diào)度弓熏,而線程是用系統(tǒng)調(diào)度
    2. 協(xié)程是異步的恋谭,而進程線程是同步的
    3. 一個線程可以有多個協(xié)程糠睡,一個進程也可以單獨擁有多個協(xié)程
    4. 協(xié)程會保留上一次調(diào)用的狀態(tài)
  • 什么是多線程?什么是多進程疚颊?
    1. 多進程:2個或2個以上的進程處于運行狀態(tài)狈孔,進程間通信不方便
    2. 多線程:把一個進程分為很多片,每一片都是一個獨立的流程材义,線程間可以互相通訊

同步阻塞模型
異步非阻塞模型

PHP并發(fā)編程實戰(zhàn)

  • 使用swoole擴展
  • 使用消息隊列
  • 接口的并發(fā)請求
    1. curl_multi_init()

數(shù)據(jù)緩存

  • 什么是數(shù)據(jù)緩存均抽?
    傳統(tǒng)關(guān)系型數(shù)據(jù)庫都是把數(shù)據(jù)存儲到硬盤中,在高并發(fā)情況下其掂,對數(shù)據(jù)庫服務(wù)器會造成巨大壓力(巨大IO操作)油挥,為了解決此問題,數(shù)據(jù)緩存由此而生款熬!
  • 作用:
    1. 極大地緩解數(shù)據(jù)庫服務(wù)器的壓力
    2. 提高數(shù)據(jù)的響應(yīng)速度
  • 緩存形式有:內(nèi)存緩存深寥、文件緩存 推薦使用內(nèi)存緩存

如何使用Mysql查詢緩存?
如何使用Memcache緩存贤牛?
如何使用redis緩存?

Web服務(wù)器負載均衡

  • 七層負載均衡(Nginx)
    1. 基于URL等應(yīng)用層信息實現(xiàn)負載均衡 一般使用Nginx(功能強大惋鹅、性能卓越、運行穩(wěn)定)來實現(xiàn), 配置簡單靈活
      內(nèi)置 加權(quán)輪詢殉簸、IP Hash 外置 fair策略闰集、通用Hash、一致性Hash
      Nginx配置負載均衡
http{
    upstream cluster{
        server srv1;
        server srv2;
        server srv3;
    }
    server{
        listen 80;
        location / {
            proxy_pass http://cluster;
        }
    }
}
  • 四層負載均衡(LVS/硬件設(shè)備)
  1. LVS
    1. LVS負載均衡的三種方式:NAT般卑、DR和TUN
  2. 硬件設(shè)備
    1. 硬件設(shè)備:通過報文中的目標地址和端口武鲁,再加上負載均衡設(shè)備的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器

MySQL數(shù)據(jù)庫優(yōu)化

  • 優(yōu)化方向
  1. 字段數(shù)據(jù)類型優(yōu)化
    1. tinyint/smallint/int/bigint的選擇
    2. char/varchar
    3. enum 固定分類
  2. IP地址數(shù)據(jù)如何存蝠检?
    1. 把IP地址轉(zhuǎn)整型類型存儲

索引
SQL語句優(yōu)化
存儲引擎優(yōu)化
表結(jié)構(gòu)設(shè)計優(yōu)化
數(shù)據(jù)庫服務(wù)器架構(gòu)優(yōu)化
讀寫分離

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沐鼠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝇率,更是在濱河造成了極大的恐慌迟杂,老刑警劉巖刽沾,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異排拷,居然都是意外死亡侧漓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門监氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來布蔗,“玉大人,你說我怎么就攤上這事浪腐∽葑幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵议街,是天一觀的道長泽谨。 經(jīng)常有香客問我,道長特漩,這世上最難降的妖魔是什么吧雹? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涂身,結(jié)果婚禮上雄卷,老公的妹妹穿的比我還像新娘。我一直安慰自己蛤售,他們只是感情好丁鹉,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 開封第一講書人閱讀 51,292評論 1 301
  • 那天拂盯,我揣著相機與錄音,去河邊找鬼记靡。 笑死谈竿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的摸吠。 我是一名探鬼主播空凸,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寸痢!你這毒婦竟也來了呀洲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎道逗,沒想到半個月后兵罢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滓窍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年卖词,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吏夯。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡此蜈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出噪生,到底是詐尸還是另有隱情裆赵,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布跺嗽,位于F島的核電站战授,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抛蚁。R本人自食惡果不足惜陈醒,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一惕橙、第九天 我趴在偏房一處隱蔽的房頂上張望瞧甩。 院中可真熱鬧,春花似錦弥鹦、人聲如沸肚逸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朦促。三九已至,卻和暖如春栓始,著一層夾襖步出監(jiān)牢的瞬間务冕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工幻赚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禀忆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓落恼,卻偏偏與公主長得像箩退,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佳谦,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容