php效能的問題

2022-02-28 20:24:51 字數 4017 閱讀 2652

一.影響php效能的常見原因

1.php自身語法使用不當

2.php做了不擅長的時期()

3.php的周邊環境(伺服器linux,磁碟:檔案儲存,資料庫,快取:記憶體,網路:頻寬)

4.php自身的短板

5.未知問題

二、分析

php**執行流程 

*.php(php檔案)->scanner(掃瞄**,分析)->exprs(儲存成zend引擎可以識別的檔案)->parser(解析)->opcodes(能被執行的檔案)->exec(執行)->output(輸出結果)

1.php語言級的效能優化。指的是php語法基本功能,這部分優化比較簡單易見、快速可行,比較快速看到效果。

1.1  少寫php的**,多用php自身能力解決問題

效能問題

自寫**冗餘較多,可讀性不佳,並且效能低,如**很長很長...php**越長php的執行效率越慢。

為什麼效能低?

php**需要解析編譯為c語言,底層c語言又要編譯成組合語言機器語言才能執行,這個過程在每次請求過來之後都要處理一遍,所以開銷很大(專案變大的話...)。

解決方法:

多使用php內建的變數、常量、函式。我們用php**實現的功能和使用php內建的函式實現的同樣功能差別是有的。

1.2 php內建函式的效能優劣。

情況描述

php內建函式之間依然存在快慢差別;少用php魔術方法;

建議:多去了解php內建函式的執行實現複雜度。

測試方法:比較效率測試,如用microtime()函式,取差值,精確到毫秒級別;linux的time命令可以檢視開銷。

1.3 產生額外開銷的錯誤抑制符號「@」,最好別用(不管是效能優化和專案的健壯性等方面)。

@的邏輯是在**前和**結束後增加了opcode,opcode的作用就是忽略報錯,其實就是相當於增加了error_reporting設定,等級報錯為忽略(vld擴充套件可以檢視被隱藏的opcode)

1.4 合理使用記憶體

利用unset()及時釋放不使用的記憶體,比如一些資料庫多餘字段(注意:unset()有時會出現登出不掉的情況)

當出現變數引用是,需要把兩個變數都unset才可以登出記憶體;或者直接$變數=null來登出

1.5 盡量少用正規表示式

正規表示式的開銷大,使用起來簡單,但是效能低因為,正規表示式需要回溯;正規表示式越長,回溯的開銷越大,優化正規表示式是需要技術水平的,正則技術不達標,不要亂用正則。

1.6 避免在迴圈內做運算。

迴圈內的計算式將被重複計算(我們在for迴圈或者while迴圈,會有重複計算,影響效能問題)

1.7 減少計算密集型業務

情況描述:

php不適合密集型(大資料量)運算的場景。

為什麼?

php的語言特性決定php不適合做大資料量運算,php語言由c寫的,php處於c基礎之上,php的所有運算處理流程需要轉化為c語言,php和c想比效能肯定輸了,並且

php語言還有一些環境問題、語言特性,相比於c而言的開銷要大很多的。php一段很長的**,可能c很短就實現了...

php適合場景:

適合銜接webserver與後端服務,webserver來了請求交給php,php做一些校驗、一些初始化資料處理,將請求**交給後端,等待後台響應,後端可能是快取、db等其他業務,

後端響應之後,php再作為紐帶,將資訊傳遞給webserver,這是php擅長的。php也擅長做ui呈現,也就是配合模板引擎做模板輸出,其實就是一些字串文字處理。

1.8 務必使用帶引號字串做鍵值(陣列的key欄位)。

php會將沒有使用引號的鍵值當做常量,產生查詢常量的開銷,如果查詢到了常量有這個字串,那麼就把常量作為這個值了。

1.9 盡量靜態化

乙個方法能被靜態,就宣告它為靜態的,速度可以提高1/4,

其實靜態方法和非靜態方法的效率主要區別在記憶體:

靜態方法在程式開始時生成記憶體,例項方法在程式執行中生成記憶體,所以靜態方法可以直接呼叫,例項方法要先成生例項,通過例項呼叫方法,靜態速度很快,但是多了會佔記憶體。

任何語言都是對記憶體和磁碟的操作,至於是否物件導向,只是軟體層的問題,底層都是一樣的,只是實現方法不同。靜態記憶體是連續的,因為是在程式開始時就生成了,而例項申請的是離散的空間,所以當然沒有靜態方法快。

靜態方法始終呼叫同一塊記憶體,其缺點就是不能自動進行銷毀,而是例項化可以銷毀。

1.10   用單引號代替雙引號來包含字串,這樣做會更快一些。因為 php 會在雙引號包圍的 字串中搜尋變數,單引號則不會

1.11  echo 比 print 快,並且使用 echo 的多重引數(譯註:指用逗號而不是句點)代替字串 連線

1.12 include 檔案時盡量使用絕對路徑,因為它避免了 php 去 include_path 裡查詢檔案的速 度,解析作業系統路徑所需的時間會更少

1.13  include()與require()的區別及require_once的代價

include() 遇到檔案處理失敗時,會產生乙個警告;

而require()則會顯示乙個致命錯誤。也就是說在指令碼執行過程中,如果**中有錯誤,include()則會忽略錯誤並繼續執行指令碼,而require()則會停止指令碼執行。

在php中使用require_once/include_once雖然方便,但是代價昂貴,據測試資料來看,require_once比require慢3-4倍,所以在php開發中,我們應該盡量使用require/include。

1.14 foreach 效率更高,盡量用 foreach 代替 while 和 for 迴圈;

總體來說,如果資料庫過幾十萬了,才能看出來快一點還是慢一點,如果低於10萬的迴圈,就不用測試了。php推薦用foreach。

迴圈數字陣列時,for需要事先count($arr)計算陣列長度,需要引入自增變數$i,每次迴圈都要進行條件判斷$i

<$c,然後自增$i++,輸出陣列元素時,$arr[$i]需要進行雜湊操作.

而foreach迴圈陣列時,指標會自動指向下乙個元素,不需要計算陣列長度,沒有條件判斷和自增變數,呼叫元素時也沒有雜湊操作,所以效能肯定要比for和while高.另外,for和while對存在鍵值對映的關聯陣列無能為力.

所以,遍歷陣列,首選foreach.foreach也是我php裡最喜歡的關鍵字,因為它確實強大.array_map/array_filter/array_walk遍歷陣列的方式和foreach一樣,但需要執行**函式,所以也比foreach慢.

2.php周邊環境的效能優化

效能排列:記憶體》資料庫》磁碟》網路

2.1 減少檔案的操作,操作完成要關閉檔案。

2.2 

網路優化:

網路原因:

1.對方介面不確定。介面位址錯誤;資料錯誤

2.網路不穩定

網路優化:

a.設定超時時間

1.鏈結超時 200ms

2.讀超時  800ms

3.寫超時 500ms

b.將序列請求並行化;把多次請求,放到一次請求中

1.使用curl_multi_*()

2.使用swoole擴充套件

2.3 壓縮php介面

使用: gzip ,php有對應壓縮和解壓的函式

利:利於我們的資料的資料輸出,client端能更快獲取資料

弊:額外的cpu開銷

2.4 快取

對於變化少,訪問量大的資料做快取;快取可以減輕伺服器負載、減低網路阻塞、增強www可擴充套件性

a.檔案快取

b.memcached

c.redis

2.5 旁路方案

3.php效能的測試

3.1 使用內建函式,測試**執行時間;microtime()

3.2 linux的time命令

3.3 apache測試工具,ab 可以測試併發時執行**所需要的時間。

調整PHP的效能

負載瓶頸 一般主要在以下四個方面 1 資料庫 2 伺服器cpu 3 硬碟 i o 4 網路頻寬 除了這四個。還有什麼值得我們優化的呢。php真很強。今天就說下在php的 腳本級上來調整php的效能。如果你想在單台伺服器 上提高php的效能。我們可以使用 編譯快取 編譯cache 不單能提高效能而且會...

PHP效能 序 談效能

這裡不談php的效能和其他語言的效能,這裡討論php自身的效能問題。效能是什麼?通俗的來講,效能,就是在固定的環境下能做的事情的多少。為什麼要效能?1 每乙個軟體或 的環境是相對固定的 2 在相當的一段時間內,在保障增加的使用者數量的同時使得當前環境的軟體或 能夠正常執行 3 為了省錢 php的效能...

優化php效能

優化php效能的五個實用技巧 以下是五個優化技巧,熟練掌握後對於開發還是很有幫助的。1.對字串使用單引號 php 引擎允許使用單引號和雙引號來封裝字串變數,但是這個是有很大的差別的!使用雙引號的字串告訴 php 引擎首先去讀取字串內容,查詢其中的變數,並改為變數對應的值。一般來說字串是沒有變數的,所...