分析頁面ajax請求時間過長問題


前提: 
商城的首頁是采用裝修做的,頁面會有很多的商品塊,采用ajax局部加載的方式來繪制到頁面上,但是部分ajax的請求速度非常慢,找出問題原因並解決


上圖可以看出:ajax請求加載頁面時,盡管會獲取的內容很小(幾百B)但是網絡相應時間卻非常長,主要集中在waiting(TTFB)

waiting(TTFB)解釋: 
從客戶端開始和服務端交互到服務端開始向客戶端瀏覽器傳輸數據的時間(包括DNS、socket連接和請求響應時間),是能夠反映服務端響應速度的重要指標,獲取在接收到響應的首字節前花費的毫秒數。


本次主要從程序方面來分析:即服務器接受請求開始到返回數據給客戶端為止 
1、看頁面ajax請求的頁面是否本身加載速度很慢 
2、在頁面請求過程中,除了本身請求的商品數據之外,是否還有其他的內容需要加載 
3、解決上述兩點問題,觀察頁面的響應時間


解決辦法: 
1、通過xhprof來進行性能分析,發現商品信息加載只耗費了43ms左右的時間,鈎子中的商城數據消耗約417ms的時間,對鈎子數據接口進行緩存,將鈎子的請求時間降到45ms左右 
重新觀察頁面,部分ajax請求的時間仍然在1-2s左右。

2、試着減少頁面的ajax強求,發現響應時間會有變化,懷疑頁面ajax請求過多導致,google:AJAX請求使PHP反應時間過長的問題。

PHP自帶Session隱患(session文件獨占鎖引起阻塞):當服務器發送一個Ajax請求時,PHP腳本開啟了session_start(),它的調用會鎖定PHP的session文件。PHP默認會把session數據存儲在服務器上的文件中。因為僅僅只有一個PHP請求能改變同一個session文件,兩個同時的PHP請求可能會造成典型的文件鎖條件。

大部分PHP框架會首先在主文件中使用session_start()。因此,如果使用會調用session_start()的框架或者函數庫,將會造成session文件鎖,對於使用同一個瀏覽器的相同用戶,這將延遲同時發送的Ajax請求。

結合了PHP的Session機制,找到了阻塞的原因。由於PHP的Session信息是寫入文件的,1個客戶端占有1個session文件。因此,當session_start被調用的時候,該文件是被鎖住的,而且是以讀寫模式鎖住的(因為程序中可能要修改session的值),這樣,第2次調用 session_start的時候就被阻塞了。

    最簡解決方法: 
PHP的手冊session_write_close函數,作用是Write session data and end session。因此,我們可以在用完session之后,調用這個函數關閉session 文件即可解除鎖定。

調用session_write_close()之后,當前腳本會繼續正常運行,但在調用session_write_close()之后不允許改變任何session變量;在同一個腳本中,其它同時發送給PHP的請求可以鎖定session文件並改變session變量。


備注: 
session數據通常會在腳本執行結束后被保存,而並不需要調用session_write_close(),但是為保護session在任何時候都只能被一個腳本執行寫操作,session的數據會被鎖住。當同時使用框架網頁和session時你會發現,框架里的網頁會因為這個個鎖定而逐個載入。可以通過在所有的session數據修改保存結束后馬上結束session來加快載入時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM