溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于PHP商城系統(tǒng)性能優(yōu)化

發(fā)布時(shí)間:2020-08-11 03:19:37 來源:網(wǎng)絡(luò) 閱讀:317 作者:德尚網(wǎng)絡(luò) 欄目:開發(fā)技術(shù)

? ? 最近在研究商城系統(tǒng)源碼,在想怎么去更好的優(yōu)化,一般來說,性能優(yōu)化可先從大的方向開始考慮,從對(duì)影響性能比較大的因素來考慮,比如現(xiàn)在使用PHP5.7,性能可以成倍提高,這些都是客觀因素,類似現(xiàn)在網(wǎng)上的開源商城,類似DSmall開源商城系統(tǒng)這類,基本都能支持高版本PHP,最后考慮的應(yīng)該是PHP語法細(xì)節(jié)上。

  1. PHP部署環(huán)境
    單臺(tái)服務(wù)器常用apache+php和nginx+php-fpm方式部署,我們一直使用apache+php方式,據(jù)說現(xiàn)在用nginx+php-fpm部署方式性能比apache+php性能好,可考慮一試。另外就是像nginx+swoole等,也是可選項(xiàng)。
    集群是在此基礎(chǔ)上,使用nginx/lvs/云上lbs等反向代理作為負(fù)載均衡前端。PHP集群部署在可靠性的基礎(chǔ)上,PHP集群處理性能比單臺(tái)服務(wù)器有N倍提高(但作為服務(wù)的整體性能并不一定有N倍提升)。所以簡(jiǎn)單地可以認(rèn)為,通過集群擴(kuò)展服務(wù)器,可以使PHP服務(wù)性能得于提升。
    2.PHP擴(kuò)展使用
    PHP擴(kuò)展除了使用方便,還是提升性能的親密伙伴。主要應(yīng)用有三點(diǎn):
    1). 開啟opcode的緩存,來避免重復(fù)的編譯。可以使用APC,eAccelerator,XCache等PHP擴(kuò)展,我們使用xcache。這種只要安裝即可的事。
    2). 使用擴(kuò)展提供的方法(或PHP標(biāo)準(zhǔn)庫(kù)的方法),擴(kuò)展實(shí)現(xiàn)的效率比PHP代碼中的高。但實(shí)際上滿足我們項(xiàng)目的擴(kuò)展方法有限,很多基礎(chǔ)方法需要時(shí)一步封裝,除非有能力自己開發(fā)擴(kuò)展??煽紤]使用擴(kuò)展實(shí)現(xiàn)的PHP框架,如phalcon、yaf。
    3). 本地緩存,也常用擴(kuò)展來支持,比如xcache。本地可使用緩存擴(kuò)展,緩存一些配置數(shù)據(jù)、元數(shù)據(jù)或主數(shù)據(jù),不用每次都從數(shù)據(jù)庫(kù)或文件中讀取。
    另,PHP版本上,現(xiàn)在可以考慮升到PHP7……
  2. 文件加載和操作
    這是非常重要的優(yōu)化建議,盡量減少文件的讀寫,文件操作包括:文件讀、判斷文件是否存在、判斷文件大小,特別是對(duì)于磁盤,減少文件操作即減少尋道時(shí)間,讀取時(shí)間。減少一個(gè)文件操作,比優(yōu)化N個(gè)CPU指令(request/request_once,echo/print,單引還是雙引)、內(nèi)存的性能效果要好得多。
    實(shí)際應(yīng)用中,關(guān)注以下幾個(gè)地方:
    1). 把.htaccess的內(nèi)容寫到apache配置中。平時(shí)我們都是通過.htaccess作為文件放置到PHP項(xiàng)目的根目錄中,作為URL重寫配置等。這就造成每次HTTP請(qǐng)求,都要先讀取.htaccess,多了一次文件操作。通常.htaccess文件內(nèi)容也不需要修改,因此可考慮在apache中配置,并禁用.htaccess文件。
    2). PHP程序中,減少file_exists等文件操作函數(shù)的使用。在路由框架中,判斷要引用的文件是否存在,如果不存在則顯示錯(cuò)誤,存在則執(zhí)行文件里的類方法。
    為什么不直接request $invoke ['path']呢?其實(shí)我們?cè)L問的路徑(文件),正常的話都是存在的,所以沒必要使用file_exists判斷是否存在。但是訪問到不存在的文件怎么呢?用set_error_handler方式全局處理。但是我只想對(duì)當(dāng)前引用文件錯(cuò)誤做特殊處理,把錯(cuò)誤處理留在自己的框架中,不使用用戶的全局的錯(cuò)誤處理呢?
    在require前,重新設(shè)置一個(gè)錯(cuò)誤處理方法A,并會(huì)返回之前設(shè)置的錯(cuò)誤處理方法;當(dāng)require文件不存在時(shí),會(huì)執(zhí)行A,require正常時(shí),重新把用戶的error_handler設(shè)置回去。
    還有一個(gè)就是日志的處理,可能每次操作日志都要判斷一下日志是否存在(不存在即創(chuàng)建)和獲取日志大?。ǚ指羧罩疚募?,一般來說,日志文件存在的可能性大,所以直接獲取文件大小即可,通過獲取日志文件大小一個(gè)方法filesize,同時(shí)可判斷文件是否存在,不存在創(chuàng)建文件即可。這就減少一個(gè)文件操作方法的使用。如何使用filesize即可獲取大小,又可判斷文件是否存在,又不離開當(dāng)前流程,正常執(zhí)行下去呢?大家可以思考一下,因?yàn)閒ilesize一個(gè)不存在的文件是會(huì)報(bào)錯(cuò)誤的哦。
    總之,只要是文件存在的可能性或者命中率高,就可考慮不要使用file_exists。
    3). 類的加載中,使用精確加載并緩存,不要遍歷目錄文件的方式。如果在一個(gè)請(qǐng)求中,只加載且只加載一次需要的類文件是最好的。
    4). 將文件緩存轉(zhuǎn)成內(nèi)存緩存。
  3. 框架的選取
    除了上面說的PHP擴(kuò)展框架,還有很多其它非擴(kuò)展實(shí)現(xiàn)的PHP框架,像thinkphp,laravel,這些框架是通用的,封裝好、功能全,但自身會(huì)損耗一定的性能,主要原因我認(rèn)為是加載的文件太多、定義的方法變量、檢測(cè)的東西太多、執(zhí)行的流程太長(zhǎng)。但既然用了,這個(gè)得接受,能做的是在語法細(xì)節(jié)、代碼邏輯上進(jìn)行優(yōu)化。僅就代碼執(zhí)行(沒有外部調(diào)用,?數(shù)據(jù)庫(kù)連接等),框架的執(zhí)行時(shí)間遠(yuǎn)遠(yuǎn)大于應(yīng)用代碼執(zhí)行時(shí)間,如果你還用上smarty模塊引擎,性能必大打折扣。但是除了性能上考慮,還有很多其它因素值得利用這些成熟框架的。如果覺得性能是要考慮的方面,可以選擇輕量一點(diǎn)、偶合性小的框架、或只選取需要的組件。
    5.功能組件的使用
    ? ? ?組合使用,需要對(duì)整個(gè)框架有一個(gè)認(rèn)識(shí)和把控。
    1). 如果可以選用組件,第一個(gè)選擇的就是路由組件了,能方便地路由到指定控制器方法即可,不要做多余的事,少用正則匹配,約定優(yōu)于配置。
    2). 類加載功能。上面說的,按需精確加載并緩存,一次請(qǐng)求有且只require一次。我們項(xiàng)目類的加載很原始,require_once and new。
    3). 參數(shù)校驗(yàn)和安全處理。實(shí)際上這個(gè)也是相對(duì)耗費(fèi)性能的過程,但為了安全還是有必要的。能做到按需參數(shù)處理最好,但是有時(shí)為方便,還是會(huì)在入口處全局處理安全過濾,參數(shù)校驗(yàn)就可以在控制器方法中處理。
    4). session,簡(jiǎn)單地通過配置保存到Redis/memcache等緩存中,或者存到cookie中。但是根據(jù)默認(rèn)的機(jī)制,session初始化(讀?。┖驼?qǐng)求結(jié)束(寫回),會(huì)產(chǎn)生兩次網(wǎng)絡(luò)操作。根據(jù)我們應(yīng)用場(chǎng)景分析,session內(nèi)容是不常變的,在不變的情況下可考慮只讀而不寫回(因此也就有不能更新session修改時(shí)間 的問題),這就要自己實(shí)現(xiàn)PHP會(huì)話的接口了,只有當(dāng)有session修改時(shí),變更的時(shí)候才回寫session存儲(chǔ),這樣,少一個(gè)網(wǎng)絡(luò)操作可省多少時(shí)間啊。有些實(shí)現(xiàn)得不好的,在一個(gè)請(qǐng)求中多次連接或多次操作存儲(chǔ)的,就不可取了。另外,結(jié)合cookieSession,即把session加密存到cookie中,對(duì)session的處理也會(huì)減少很多耗時(shí)。
    5). 視圖模板引擎。如果是API類接口服務(wù),直接返回?cái)?shù)據(jù),如果是網(wǎng)頁(yè),那就需要使用模板引擎了。模板引擎也是很耗費(fèi)性能的主,當(dāng)然,喜歡原生態(tài)的方式,那是最高效的,像smarty這種,大而全,性能低效,而且很多功能我們都用不上。我們使用模板引擎,最核心的是html與PHP分離,然后才是變量與語法的處理。所以,要享受模板引擎的分離好處,又追求性能,那可以參考tmd_tpl。只實(shí)現(xiàn)分離,語法上使用PHP語法,因?yàn)槿绻约簩?shí)現(xiàn)一套語法,需要大量的查找和替換。同樣在模板引擎中,可以進(jìn)一步合并多個(gè)視圖文件為一個(gè),減少文件操作等方式來優(yōu)化。
    6). 數(shù)據(jù)庫(kù)方面。使用PDO,ORM使用方便但也有一定耗時(shí),數(shù)組作為數(shù)據(jù)對(duì)象最高效,一般用短連接,使用單例連接對(duì)象或連接池(有些擴(kuò)展可支持)。
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI