架構(gòu)優(yōu)化涉及到技術(shù)、存儲、網(wǎng)絡(luò)、服務(wù)的選型和構(gòu)架,盡量使用成熟和現(xiàn)代的開發(fā)架構(gòu)和設(shè)計模式。前后端完全分離設(shè)計,便于前后端的獨立優(yōu)化,也更加便于測試工作。
創(chuàng)新互聯(lián)公司專注于武邑企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站開發(fā)。武邑網(wǎng)站建設(shè)公司,為武邑等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
如果你的應(yīng)用遇到了性能瓶頸,這個時候要考慮的就是優(yōu)化架構(gòu)而不是優(yōu)化代碼本身,因為架構(gòu)層面的優(yōu)化效果往往是最顯著的。
架構(gòu)的優(yōu)化需要根據(jù)自身運營情況來調(diào)整,切忌不可按圖索驥提前優(yōu)化,反而容易得不償失,導(dǎo)致技術(shù)成本提高甚至“負優(yōu)化”
部署環(huán)境千萬不要忘記關(guān)閉調(diào)試模式,這不僅僅是出于性能考慮,更多是基于安全因素。事實上,建議通過環(huán)境變量來配置關(guān)閉調(diào)試模式,這樣部署后不需要更改任何配置文件。
因為調(diào)試模式影響日志記錄信息、額外的調(diào)試信息和緩存失效,關(guān)閉調(diào)試模式能夠帶來一定的性能提升
使用多模塊功能會增加文件的 I/O 開銷和額外的配置及檢查,如非必要在規(guī)劃你的應(yīng)用架構(gòu)的時候盡量考慮使用單一模塊,然后使用控制器分級來解決控制器過多的問題。
使用單一模塊的性能優(yōu)勢,在部署到 swoole 的時候可以得到更加充分的體現(xiàn),因為應(yīng)用文件一旦啟動服務(wù),就會載入內(nèi)存,而模塊的相關(guān)文件則會每次請求重新加載。
在定義路由規(guī)則的時候,不要使用數(shù)組方式,盡量使用方法注冊路由,并且多使用路由分組(或者資源路由)。分組路由可以減少路由的匹配次數(shù),從而提升路由性能。如果你有多個域名的不同路由,也要按域名規(guī)劃使用路由。
盡可能設(shè)計在路由中進行當前路由的數(shù)據(jù)驗證和權(quán)限檢查等操作,一方面比較清晰,另外一方面可以盡量把驗證操作提前,而不必等到控制器執(zhí)行。
在分組比較多的情況下,開啟路由的延遲解析。
如果同一個分組下面有比較多的路由規(guī)則,建議合并路由規(guī)則
對于 GET 請求的路由,可以設(shè)置路由的請求緩存。
部署階段,可以開啟路由緩存。
首先保持良好的開發(fā)習慣,了解 Db類和模型的正確使用姿勢 ,數(shù)據(jù)庫本身的性能優(yōu)化可以參考 MySQL性能優(yōu)化的最佳21條經(jīng)驗 ,下面主要是對框架中數(shù)據(jù)查詢相關(guān)的優(yōu)化策略。
盡量減少每次請求的查詢次數(shù),并對實時性要求不高的數(shù)據(jù)查詢合理規(guī)劃數(shù)據(jù)查詢緩存(優(yōu)先考慮使用 Redis 緩存)
如果使用了關(guān)聯(lián)查詢, cache 方法只能用于主模型的數(shù)據(jù)緩存,但你可以使用 Cache 類的 remember 方法進行方便的數(shù)據(jù)緩存。
盡量減少查詢次數(shù)是出于性能考慮,但不是必須,使用最少的查詢不代表性能就一定是最高。一個復(fù)雜的 JOIN 查詢性能不見得有兩次簡單的查詢高,而使用簡單的查詢反而更清晰易懂,并且更方便進行數(shù)據(jù)查詢緩存。
不要總是以為模型的性能一定比 Db 類低,框架的ORM查詢設(shè)計經(jīng)過了較為合理的優(yōu)化,正確使用模型一樣可以有出色的性能,而且比 Db 查詢要方便很多。
尤其是對于一些復(fù)雜的設(shè)計來說使用模型關(guān)聯(lián)顯得比直接用Db更加簡單,例如使用關(guān)聯(lián)預(yù)載入查詢就可以避免 N+1 查詢問題。
如果用 Db 類自己實現(xiàn)的話,費時費力,性能還不一定優(yōu)。
對于內(nèi)存開銷比較大的應(yīng)用,在做大量數(shù)據(jù)查詢和處理的時候,使用 cursor 方法,可以利用PHP的生成器特性,減少內(nèi)存占用。
你會發(fā)現(xiàn)用戶數(shù)據(jù)不論是1萬還是10萬級別,內(nèi)存開銷并沒有大的變化。
涉及到對大量數(shù)據(jù)的處理,包括數(shù)據(jù)遷移、批量更新,盡量使用命令行指令運行,否則會因為超時而中斷
可以通過數(shù)據(jù)集的方法完成的子集或者排序操作不要再次查詢,例如:
利用下面指令在部署后生成字段緩存,可以減少每次數(shù)據(jù)表的字段查詢開銷。
注意:一旦數(shù)據(jù)庫的表結(jié)構(gòu)發(fā)生變化,必須重新生成。
每次在應(yīng)用初始化或者模塊初始化的時候會有一定的 I/O 開銷,如果已經(jīng)開啟 OpCache 的話對性能影響甚微,如果比較在意的也可以通過命令行指令生成配置緩存(包括相關(guān)的公共文件和各種定義文件)。
生成應(yīng)用配置緩存:
生成模塊配置緩存:
注意:一旦配置或者公共文件發(fā)生變化,必須重新生成。
類庫映射可以提升類庫的自動加載性能,使用下面的指令可以生成系統(tǒng)類庫和應(yīng)用類庫的類庫映射(包括 extend 目錄下的類庫)。
vendor 目錄下的類庫可以使用 composer 的 dump-autoload 指令優(yōu)化加載性能。
該命令把 PSR-0 和 PSR-4 轉(zhuǎn)換為一個類映射表,來提高類的加載速度。
大數(shù)據(jù)的話可以進行以下操作:
減少對數(shù)據(jù)庫的讀取,也就是減少調(diào)用數(shù)據(jù)庫,
進行數(shù)據(jù)緩存,
利用數(shù)據(jù)庫的自身優(yōu)化技術(shù),如索引等
精確查詢條件,有利于提高查找速度
?php$mysql_server_name='localhost';$mysql_username='root';$mysql_password='12345678';$mysql_database='mycounter';$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database);$sql='CREATE DATABASE mycounter DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;';mysql_query($sql);$sql='CREATE TABLE `counter` (`id` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT ,`count` INT(255) UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY ( `id` ) ) TYPE = innodb;';mysql_select_db($mysql_database,$conn);$result=mysql_query($sql);//echo $sql;mysql_close($conn);echo "Hello!數(shù)據(jù)庫mycounter已經(jīng)成功建立!";?
有點復(fù)雜,建議你去后盾人那自學,他們最近在搞實訓(xùn)班培訓(xùn)活動有時間去看看吧
2個方面:sql語句優(yōu)化,緩存。
sql語句中select * from 表 不需要全部信息的話就盡量不要用*,要哪個字段就寫哪個,不要怕寫。
如今php中有許多的緩存方式,有模板緩存,sql查詢緩存。代表有smarty和memcache,當然,其他還有很多優(yōu)秀的緩存方式,我就不多說了。