国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 開發中的外圍資源性能分析(一)

anquan / 2810人閱讀

摘要:而是說,程序的外部資源,往往是影響性能的重要因素,尤其是當外部資源的連接和數據獲取本身速度達不到理想的結果時。

暫且不討論「PHP 是不是最好的編程語言」,本文我們將分別分析一下在 PHP 程序的后端外圍資源和前端外圍資源,它們對整個 PHP Web 應用體驗的影響,這往往比語言本身大得多。

首先,后端外圍資源,是指跟 PHP 運行過程中與語言本身無關的網絡與 IO 操作、存儲服務、中間件代理、緩存和數據庫訪問等,在本文中,我們先分析 IO 操作和中間件服務。

為什么外圍資源的性能分析,要以以上三者分析為主?我們可以看如下國內專業的性能監控工具 OneAPM 的 PHP Web 應用后臺截取下來的總覽圖,通過這個圖可以看到,數據庫所花費的時間在總 PHP 響應時間中,占據著 60% 甚至更大的比重,而 Memcached 緩存服務,在這張圖里所占的響應時間,幾乎看不見。

下面正式開始。

一、IO 操作

PHP 語言本身盡管有性能的差異,但是從對 PHP 的性能微觀分析也可以看出,如果只執行單次操作,實際中這種差別是非常小的,前面的實驗中,十萬次以上操作,才有百 ms 級的差別,因為 PHP 語言本身操作的是內存,一次內存訪問,大約在 50ns 左右。而 IO 操作,則是磁盤訪問,一次磁盤訪問所費時間在 5ms 以上。僅從這個數量級看是 10 萬倍的差距,實際上,根據實驗,也有百倍級的差距(順序訪問和隨機訪問差距巨大,實際中兩者同時進行,還會有磁盤緩存等)。

所以對比語言本身,IO 成為瓶頸的可能性更大。首先看一下,IO 操作帶來的性能差別。

一個 PHP 腳本,通過 PHP 命令方式運行,正常時,消耗時間如下:

當使用如下命令清空磁盤緩存后:

 echo 3 | sudo tee /proc/sys/vm/drop_caches

得到的第一次運行時間下如下圖所示:

代碼一模一樣,但是運行時間卻是正常運行時間的 6 倍。當然這個時間的慢,并不僅僅是由于程序本身的 IO 操作導致,而更大的慢的因素是在 CGI 模式下,PHP 腳本的每一次運行都需要加載所有模塊,這個加載,也伴隨著大量的 IO 操作。

再做一個實驗,完全同樣功能的兩個頁面,一個采用了 MVC 的方式,把頭部,尾部拆開成獨立的模板(并未使用模板引擎),中間邏輯也使用獨立的 Model 類來處理。另一個只 require 了宏定義和數據庫操作兩個文件。

使用命令ab -c 40 -n 1000 http://xxxxx/0929/zuche/carlist.php
進行壓力測試, 這兩個頁面運行穩定后壓測結果數據如圖所示。

在這個頁面中,MVC 版本所費時間要多 6-8ms 左右。雖然只是多增加了幾個文件包含,但是明顯增加了請求延時,如果文件操作本身更加復雜,比如文件上傳、檢測、轉換,則延時會增加一個數量級以上。在實際的生產使用中,也不是說有了文件操作,就一定會產生大的延時,因為就像本例的 require 而言,由于磁盤緩存等的存在,延時的影響已降低很多。

二、中間件代理

在正式使用中間件之前,我們先對比一下,使用數據庫與不使用數據庫的差別,同樣是上面的這個例子,我們把數據結果集,從數據庫獲取轉換成為直接的結果數組設置,為了結構化清楚,采用 MVC 這一版。同時為了更顯著對比上一輪測試結果,同時也消除語言本身的一些慢的因素,在本輪實驗中,我們采用 PHP7,得到結果是令人吃驚的。
如下圖是帶有數據庫連接和數據讀取的版本,PHP 擴展使用的是 mysqli。

由于本頁面,只有一次數據庫操作,頁面結構也比較簡單,語言本身的影響因素非常大,PHP7 下速度有兩倍以上提升,原來平均響應時長為 37-40ms,現在則為 14ms。

即使如此,不讀取數據庫時,有 4ms 的差距,盡管數目上不大,但是對于一個總響應時長只有 14ms 的應用,這 4ms 已經很顯著了,而這只是一個數據庫查詢操作。

接下來看一下,當增加一層數據庫中間件時,效率又有怎么樣的變化呢?由于筆者所使用的中間件,目前并不支持 PHP7,所以我們還在老版 PHP 的基礎上來比對。在同樣的服務器壓力下,使用了中間件的版本慢了一倍以上。如下圖所示。

從這個例子可以看出來,原本 PHP 直接連數據庫,取得數據的操作,增加了中間件之后,變了先到中間件,中間件再到數據庫,返回亦如是,導致了速度的大幅度下降(這里已經剔除了中間件本身占用資源的因素,在原來直連的版本是 37-40ms 左右)。

這里也請讀者不要誤解,演示中間件使用速度下降的例子,并不是說為了說明中間件不好,在分布式環境下,使用中間件是非常必要的。而是說,程序的外部資源,往往是影響性能的重要因素,尤其是當外部資源的連接和數據獲取本身速度達不到理想的結果時。

對于 IO 操作和中間件服務的分析就到這里,下篇將分析數據庫給整個應用性能帶來的影響。

OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21143.html

相關文章

  • PHP 開發中的外圍資源性能分析(二)

    摘要:本文作為針對外圍資源性的能分析,比較簡單地設計了一些實驗場景,看到了外部資源,包括中間件和數據庫資源給程序性能帶來的影響。有關影響程序性能的后端外圍資源就到這里,在下一篇中,我們將分析前端或者前后端結合給頁面延時帶來的影響。 暫且不討論「PHP 是不是最好的編程語言」,本文我們將分別分析一下在 PHP 程序的后端外圍資源和前端外圍資源,它們對整個 PHP Web 應用體驗的影響,這往往...

    cod7ce 評論0 收藏0
  • PHP的工作原理和生命周期

    摘要:的工作原理和生命周期是一門適用于開發的動態語言,它可以說是一個用語言實現的包含大量組件的軟件框架。無論是哪種公眾模式,的工作原理都是一樣的,都是作為一種運行。 PHP的工作原理和生命周期 php是一門適用于web開發的動態語言,它可以說是一個用C語言實現的包含大量組件的軟件框架。那么,php是如何工作的呢?它的生命周期是怎么樣的呢? 表層分析 php是以請求/響應為周期運行服務端應用...

    happyhuangjinjin 評論0 收藏0
  • 面試分享:最全Spring事務面試考點整理

    摘要:和事務的關系關系型數據庫某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。事務的傳播特性,,,,,,強制要求要有一個物理事務。外圍事務不會被內部事務的回滾狀態影響。不支持當前事務。 Spring和事務的關系 關系型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。 Spring很顯然不是事務性資源,但是它可...

    graf 評論0 收藏0
  • PHP底層工作原理

    摘要:因此,我們需要性能優異的引擎合適的車輪正確的跑道三架構從下往上四層屬于操作系統的底層服務器,屬于次服務器,溝通和屬于服務端編程語言,通過模塊和關聯和其他服務屬于應用服務,通過的外掛模塊和關聯參考文檔底層工作原理 一、簡介 PHP總共有三個模塊:內核、Zend引擎、以及擴展層 PHP內核用來處理請求、文件流、錯誤處理等相關操作 Zend引擎(ZE)用以將源文件轉換成機器語言,然后在虛擬...

    mumumu 評論0 收藏0
  • 當企業關鍵業務遇上華為云存儲FusionStorage

    摘要:在華為全聯接大會上,新一代關鍵業務云存儲的重大升級,被推上前臺。華為存儲產品線總裁孟廣斌華為稱,該產品在云存儲領域首個具備支撐企業關鍵業務的能力。華為存儲產品線總裁孟廣斌說。對于分布式存儲這條企業級產品,華為早已篤定了一個方向,它應該具備承載關鍵業務的一切能力并臻于極致、高可靠、易運維、高性能,甚至低TCO和完善的生態兼容。10月10日,華為繼續用行動來重申對這一方向的堅持。在華為全聯接大會...

    xuhong 評論0 收藏0

發表評論

0條評論

anquan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<