掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
WordPress作為一款知名的CMS管理系統(tǒng),在全球范圍內(nèi)廣泛部署,據(jù)說全球超過四分之一的網(wǎng)站基于WordPress創(chuàng)建,比如美國白宮官網(wǎng)也是基于WordPress創(chuàng)建的。WordPress具備很多優(yōu)點,比如使用簡單、資源豐富;但作為一款標準的CMS系統(tǒng),由于需要考慮很多場景需求,因此從性能上來講,原版的WordPress性能上并沒有優(yōu)勢。
近期,某客戶網(wǎng)站是多年前基于WordPress創(chuàng)建的官網(wǎng),之前是運在linux服務(wù)器上,最近他們單位自己機房使用的是windows服務(wù)器。結(jié)果遷移上去后,明顯變得卡不少,原來基本上是秒開,現(xiàn)在還要進度條轉(zhuǎn)一兩秒。
一般來講,只要水平不是太差的開發(fā)人員,自研的程序在性能上是優(yōu)于這些現(xiàn)成的CMS系統(tǒng)的,因此除官網(wǎng)外我們微構(gòu)網(wǎng)絡(luò)基本采用自研開發(fā)的網(wǎng)站程序(現(xiàn)在官網(wǎng)項目也基本采用自研程序)。在通常WordPress卡主要原因是有如下幾個原因:
1、前端引用了google等境外服務(wù)器的資源,比如谷歌字體文件。
這個因素基本在國內(nèi)采用WordPress的網(wǎng)站都不存在了,因為如果存在網(wǎng)站將卡得沒法用,因為這些資源被防火墻攔截了,是無法訪問的。因此大家,都是在創(chuàng)建項目后基本上就屏蔽或者用國內(nèi)的鏡像資源替代這些資源了。
2、數(shù)據(jù)庫操作造成的卡頓。
雖然WordPress的數(shù)據(jù)庫操作,性能確實不高,但WordPress的定位就是博客程序,所以從這個程序設(shè)計上就不是定位高性能,隨便一個頁面就是幾十次查詢操作。但即便是這樣,在并發(fā)不高的網(wǎng)站,基本上不會因為這個原因造成的卡。
接下來就開始排查流程了,首先要排除上述兩個常見因素。被攔截的前端資源這個因素不存在,因為在linux服務(wù)器上是沒問題的;數(shù)據(jù)庫操作問題理論上也不是,因為這種官網(wǎng)訪問量并不高,而且在原來服務(wù)器上也沒問題。
然后刪除所有代碼,進行程序空載測試。也就是所有的自定義代碼全部刪除,僅僅只加載WordPress核心程序。結(jié)果發(fā)現(xiàn)竟然還是要1秒以上。
當然WordPress空載的時候,核心程序也會進行數(shù)據(jù)庫操作,監(jiān)測的sql語句如下3條:
在加上通過調(diào)試wp-blog-header.php這個核心入庫文件發(fā)現(xiàn),即便禁止程序進行后續(xù)輸出操作,頁面執(zhí)行時間也超過一秒。也就是只要執(zhí)行wp-blog-header.php中的
require_once( dirname(__FILE__) . '/wp-load.php' );
就要一秒以上,這顯然非常不正常。繼續(xù)追蹤溯源調(diào)試,最后發(fā)現(xiàn)是這樣的鏈路:
//文件:/wp-load.php require_once( ABSPATH . 'wp-config.php' ); //文件:/wp-config.php require_once(ABSPATH . 'wp-settings.php'); //文件:/wp-settings.php require_wp_db(); //文件:/wp-includes/load.php $wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); //文件:/wp-includes/db.php mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
也就是最終造成卡的就是mysqli_real_connect這個方法了,而這個方法是php自帶的一個方法,作用是建立數(shù)據(jù)庫鏈接。從中可以看出還是程序與數(shù)據(jù)庫之間存在問題,為了驗證這個問題。我們編寫了一小段不基于任何框架或程序的測試代碼,代碼如下:
<?php $t1=microtime(true); $h=mysqli_init(); $r=mysqli_real_connect( $h, 'localhost', 'root', 'password', null, '3306' ); var_dump($r); $t2=microtime(true); var_dump($t2-$t1);
這段代碼的意義就是在于建立一個數(shù)據(jù)庫鏈接,然后查看建立這個鏈接所需要花的時間,測試結(jié)果如下:
也就是僅僅建立一個數(shù)據(jù)庫鏈接所需要的時間就是1秒多,因此造成前面所說的卡的主要原因就是在進行建立數(shù)據(jù)庫鏈接時所花費的時間。通過查找相關(guān)資料得知,造成這個原因一個常見問題就是由于在配置數(shù)據(jù)庫鏈接的時候,host填寫的是localhost而不是127.0.0.1,只需要修改為127.0.0.1即可。
使用127.0.0.1時所話的時間都是個位數(shù)毫秒級,這個時間幾乎可以忽略不計。當然很多標準的程序默認數(shù)據(jù)庫配置信息就是填寫localhost,而為什么某些情況就不行呢??梢詤⒖嘉覀儼l(fā)布的下一篇文章。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流