PHP如何解決網站大流量與高并發的問題(一)

      網友投稿 1084 2025-03-31

      在某個時間點,有多少個訪問量

      如果一個系統的日PV在千萬以上,有可能是一個高并發的系統

      QPS:?每秒鐘請求或者查詢的數量,在互聯網領域,指每秒相應請求數(指HTTP請求)

      吞吐量:?單位時間處理的請求數量

      響應時間:?從請求發出到收到相應花費的時間

      PV:?綜合瀏覽量 page view 頁面瀏覽量或者點擊量,一個訪客在24小時之內的瀏覽量或者點擊量

      UV:?獨立訪客unique visitor,一定時間范圍內相同訪客多次訪問網站,只計算一獨立個訪客

      帶寬:?計算帶寬大小需關注兩個指標,峰值流量和頁面平均大小

      日網站帶寬 = PV/統計時間(s)?平均頁面大小(k)?8

      峰值一般是平均值的倍數,根據實際情況來定

      QPS不等于并發連接數量

      QPS是每秒HTTP的請求數量,并發連接數量是系統同事處理的請求數量

      峰值每秒請求數(QPS) = (總PV數?80%) / (6小時秒數?20%)

      代表80%的訪問量集中在20%的時間(28定律)

      壓力測試:

      壓力測試

      常用的性能測試工具

      ab(apache benchmark)

      模擬并發請求100次,總共請求5000次

      1

      2

      3

      4

      ab -c 100 -n 5000 http://**.com

      //-c 并發數

      //-n 請求數量

      注意事項:

      測試機器與被測試機器分開 | 不要對線上服務做壓力測試 | 觀察測試功工具ab在機器以及被測試的前端機的CPU、網絡等不超過75%

      QPS達到50:不需要優化

      QPS達到100: 假設關系型數據庫的每次請求在0.01s完成,假設單個頁面只有1個SQL,那么100QPS以為這1秒鐘完成100次請求,但是此時我們并不能保證數據庫查詢能完成100次

      方案:數據庫緩存層,數據庫的負載均衡

      QPS達到800:

      假設我們使用百兆貸款,以為這網站出口的實際寬帶是8M左右

      假設每個頁面只有10k,在這個并發下,百兆貸款已經吃完

      方案:?CDN加速,負載均衡

      QPS達到1000:

      假設使用mem緩存數據,每個頁面對mem的請求數遠大于直接對db的請求

      mem的悲觀并發數在2w左右,但是有可能在之間內網寬帶已經吃光,表現不穩定

      方案:?靜態HTML緩存

      QPS達到2000:

      這個級別下,文件系統訪問鎖都成為了災難

      方案:?做業務分離,分布式存儲

      測試能承受的最大并發

      測試最大承受的QPS值

      流量優化

      防盜鏈處理

      前端優化:減少http請求(合并css,js,圖片)、添加異步請求、啟用瀏覽器緩存和文件壓縮、CDN加速、建立獨立圖片服務器

      服務端優化:頁面靜態化、并發處理

      數據庫優化:數據庫緩存(mem,redis),分庫分表、分區操作、讀寫分離、負載均衡

      Web服務器優化:負載均衡

      盜鏈概念:

      盜鏈是指在自己的頁面上展示一些并不在自己服務器上的內容

      常見的小站盜用大戰的圖片、音樂、視頻、軟件資源

      通過盜鏈的方法可以減輕自己服務器的負擔,因為真實的空間和流量均是來自別人的服務器

      防盜鏈的概念:

      防止別人通過一些技術手段盜用自己站點的資源,讓資源在別人的站點上無法訪問

      可以大大減輕服務器以及帶寬壓力

      工作原理:?通過Referer或者簽名,網站可以檢測目標網頁訪問的來源網頁

      Referer(有漏洞,可偽裝)

      nginx 模塊,ngx_http_referer_module用來阻擋來源非法的域名請求

      Nginx指令valid_referers,全局變量$invalid_referer

      valid_referers none|blocked|server_names|string…

      none 代表為空時

      blocked 代表來源頭部不為空,但是里面的值被防火墻刪除

      server_names 代表信任的地址

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$

      {

      valid_referers none blocked immoc.com *.imooc.com

      #如果有不允許的訪問,$invalid_referer 為1 ,重定向到錯誤頁面

      if($invalid_referer) {

      #return 403

      rewrite ^/ http://www.imooc.com/403.jpg

      }

      }

      加密簽名。使用第三方模塊HttpAccessKeyModule實現Nginx防盜鏈

      1

      2

      3

      4

      5

      6

      7

      accesskey on|off 模塊開關

      accesskey_hashmethod md5 | sha-1簽名加密方式

      accesskey_arg GET參數名稱呢

      accesskey_signature加密規則

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$

      {

      accesskey on;

      #加密方式

      accesskey_hashmethod md5;

      #獲取參數的鍵

      accesskey_arg sign;

      #簽名規則

      accesskey_signatur 'jason$remoe_addr';

      }

      1

      2

      3

      4

      5

      6

      7

      //md5(jason.ip)

      //PHP中的加密規則

      $sign = md5('jason'.$_SERVER['REMOTE_ADDR']);

      echo ""

      ####減少HTTP的請求

      性能黃金法則:只有10%-20%的最終用戶響應時間花在接受請求的HTML上,剩下的80%-90%時間花在HTML文檔所引用的js,css等組件上

      如何改善:改善相應時間的最簡單的途徑就是減少組件的數量,并由此減少HTTP的請求量

      HTTP請求連接產生的開銷

      域名解析–TCP連接–發送請求–等待–下載資源–解析時間

      疑問?

      DNS緩存、Keep-Alive會不會消除影響

      查找DNS緩存也需要時間,多個緩存就要查找多次有可能緩存會被清楚

      HTTP1.1協議規定請求只能串行發送,也就是100個請求必須依次逐個發送,前面的一個請求完成才能開始下個請求

      圖片地圖:圖片地圖允許你在一個圖片上關聯多個URL,目標URL的選擇取決于用戶單擊了圖片上的那個位置

      1

      2

      3

      4

      5

      6

      7

      8

      ...

      ...

      CSS Sprites

      CSS Sprites中文翻譯CSS精靈,通過使用合并圖片,通過指定的cssbackground-image 和backgroud-position來顯示元素

      合并腳本和樣式表

      使用外部的js和css文件引用的方式,因為這樣比直接寫在頁面中性能要更好一點

      把多個腳本合并成一個腳本,把多個css合并成一個css

      圖片使用Base64編碼減少頁面請求數

      采用base64的編碼方式將圖片直接嵌入到網頁中,而不是從外部載入

      1

      瀏覽器緩存和數據壓縮

      高并發下只能通過提升服務器負責解決嗎?

      緩存只能做數據庫緩存嗎?

      相關概念

      HTTP緩存機制

      前端代碼和資源的壓縮

      HTTP緩存模型中,如果請求成功會有三種情況

      200 from memory cache:直接從本地緩存中獲取相應,最快速,最省流量,因為根本沒有向服務器發送請求

      本地緩存

      相關Header

      Pragma:HTTP1.0時代的遺留產物,該字段被設置為no-cache時沒,會告知瀏覽器禁用本地緩存,每次都向服務器發送請求

      Expires:HTTP1.0時代用來啟動本地緩存的字段,expires值對應一個形如Thu,31 Dec 2037 23:55:55 GMT的格林威治時間,告訴瀏覽器緩存實現的時刻,如果時間還沒到,標明緩存有效,無需發送請求,但是Expire是Nginx發送的,如果瀏覽器時間不準確,會造成很大的影響

      Cache-Control:HTTP1.1針對Expires時間不一致的解決方案,運用Cache-Control告知瀏覽器緩存國企的時間間隔而不是時刻,即使具體時間不一致,也不影響緩存的管理

      no-store:禁止瀏覽器緩存響應

      no-cache:不允許直接使用本地緩存,先發起請求和服務器協商

      max-age=delta-seconds:告知瀏覽器該相應本地緩存有效的最長期限,以秒為單位

      優先級

      Pragma > Cache-Control > Expires

      304 Not Modified:協商緩存,瀏覽器在本地沒有命中的情況下請求頭中發送一定的校驗數據到服務端,如果服務端數據沒有改變,瀏覽器從本地緩存相應,返回304

      相關Header

      Last-Modified:通知瀏覽器資源的最后修改時間

      If-Modified-Since:得到資源的最后修改時間后,會將這個信息通過If-Modified-Since提交到服務器做檢查,如果沒有修改,返回304狀態碼

      ETag:HTTP1.1推出,文件的指紋標識符,如果文件內容修改,指紋會改變

      If-None-Math:本地緩存失效失敗,會攜帶此值去請求服務端,服務端判斷該資源是否改變,如果沒有改變,直接使用本地緩存,返回304

      200 OK 以上兩種緩存失敗,服務器返回完整相應數據,沒有用到緩存,相對最慢

      適合本地緩存的內容

      不變的圖像,如logo,圖標

      js,css靜態文件

      下載的文件

      適合使用協商緩存

      HTML文件

      經常替換的圖片

      經常修改的js,css文件

      js,css文件的加載可以加入文件的簽名來拒絕簽名 index.css?簽名|index.簽名.js

      不建議緩存的內容

      用戶隱私等敏感數據

      經常改變的api數據接口

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      //獲取響應頭的If-Modified-Since參數

      $since = $_SERVER['HTTP_IF_MODOFIED_SINCE'];

      //設置生存時間

      $lifttime = 3600;

      //如果沒有過期

      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')

      1

      2

      3

      4

      add_header指令:添加狀態碼為2xx和3xx的相應投信息

      add_header name value [always]

      可以設置Pragma/Expire/Cache-Control,可以繼承

      expires指令:通知瀏覽器過期時間expires time;為負值時表示Cache-Control:no-cache

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      # nginx.conf

      location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$

      {

      valid_referers none blocked immoc.com *.imooc.com

      #如果有不允許的訪問,$invalid_referer 為1 ,重定向到錯誤頁面

      if($invalid_referer) {

      #return 403

      rewrite ^/ http://www.imooc.com/403.jpg

      }

      # 緩存30天

      expires 30d;

      # 關閉etag

      etag off;

      # 添加cache-control

      add_header

      cache-control max-age=3600

      }

      可以讓資源文件更小

      壓縮方式:js,css,image,html代碼壓縮、

      Gzip壓縮

      js壓縮的原理一般是去掉多余的空格和回車,替換長變量名,簡化寫法

      常用的壓縮工具:UglifyJS、YUI Compressor

      、Closure Compiler

      圖片壓縮:

      壓縮工具:tinypng、JpegMini,ImageOptim

      Gzip壓縮:?配置Nginx

      1

      2

      3

      4

      5

      6

      gzip on|off

      gzip_buffers 32k

      gzip_disable

      gzip_min_length 200

      ...

      ...

      https://zhyunfe.github.io/2017/10/01/php-interview-prepare-hc-1/

      PHP 網站

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何在Word文檔中創建相關的下拉列表?
      下一篇:為什么要使用在線表單?使用在線表單生成器有啥好處?
      相關文章
      亚洲AV无码一区二区三区在线| 久久久久亚洲AV成人网人人网站| 亚洲综合色成在线播放| 亚洲伊人久久大香线蕉AV| 亚洲精品影院久久久久久| 亚洲成AV人片在| 在线观看午夜亚洲一区| 中文字幕亚洲不卡在线亚瑟| 日韩亚洲国产综合久久久| 337P日本欧洲亚洲大胆艺术图| 亚洲国产精品无码久久| 亚洲日韩国产二区无码| 亚洲国产精品久久久久秋霞小| 亚洲欧美日韩久久精品| 亚洲午夜福利在线视频| 亚洲av乱码中文一区二区三区| 国产AV无码专区亚洲AV蜜芽 | 亚洲国产精品无码久久久蜜芽 | 亚洲中文字幕视频国产| 亚洲欧洲日产国码一级毛片| 亚洲午夜精品久久久久久浪潮 | 久久影视综合亚洲| 亚洲中文字幕无码中文字在线| 亚洲熟妇无码乱子AV电影| 亚洲精品乱码久久久久66| 日韩亚洲人成在线综合日本| 国产AV无码专区亚洲A∨毛片| 久久精品国产亚洲| 精品亚洲A∨无码一区二区三区| 亚洲综合小说久久另类区| 国产精品亚洲精品青青青| 亚洲av永久中文无码精品综合| 日韩精品亚洲专区在线影视| 亚洲国产中文字幕在线观看| 国产性爱在线观看亚洲黄色一级片| 人人狠狠综合久久亚洲88| 亚洲午夜在线电影| 久久亚洲AV无码精品色午夜麻豆| 亚洲伊人色一综合网| 亚洲精品精华液一区二区| 亚洲人成无码网WWW|