多個ajax請求php後端導致反應時間慢解決方案
阿新 • • 發佈:2019-01-29
產生的原因
var democ=new Vue({ el:'#list', data:{ her:'', listData:[], listurl:ALLURL+'/index.php/Wap/Read/indexlist' }, created:function(){ this.listDll() }, methods:{ listDll:function(){ var that=this; that.$http({ method:'GET', url:this.listurl }).then(function(response){ //console.log(response.data) var obj=JSON.parse(response.data); this.her=ALLURL; this.listData=obj.data; },function(error){ }) } } }); $.get(ALLURL+'/index.php/Wap/Read/indexlist', function(res){ var obj=JSON.parse(res); var Data=obj.data; } ); $.get(ALLURL+'/index.php/Wap/Read/cases', function(res){ var obj=JSON.parse(res); var Data=obj.data; } ); / $.get(ALLURL+'/index.php/Wap/Read/active', function(res){ var obj=JSON.parse(res); var Data=obj.data; } ); $.get(ALLURL+'/index.php/Wap/Read/record', function(res){ var obj=JSON.parse(res); var Data=obj.data; } );
多個介面請求,經執行後發現需要執行10秒左右時間,初以為是php與資料庫互動花的時間過多導致,其實不然,真正原因是session檔案鎖導致。
當你向伺服器傳送一個Ajax請求時,PHP指令碼也開啟了session_start(),它的呼叫會鎖定PHP的session檔案。
你可能已經知道,PHP預設會把session資料儲存在伺服器上的檔案中。因為僅僅只有一個PHP請求能改變同一個session檔案,兩個同時的PHP請求可能會造成典型的檔案鎖條件,因此,任何一個其他由PHP呼叫的對於同一個使用者的session_start()請求將不得不等到第一個請求結束。
現在,大部分PHP框架會首先在主檔案中使用session_start()。因此,如果你正在使用會呼叫session_start()的框架或者函式庫,將會造成session檔案鎖,對於使用同一個瀏覽器的相同使用者,這將延遲同時傳送的Ajax請求。
簡言之同一個客戶端同時併發傳送多個請求(如ajax在頁面同時傳送多個請求),且指令碼執行時間較長,就會導致session檔案阻塞,影響效能。因為對於每個請求,PHP執行session_start(),就會取得檔案獨佔鎖,只有在該請求處理結束後,才會釋放獨佔鎖。這樣,同時多個請求就會引起阻塞。
解決方案
1.不用session
2.呼叫session_write_close()
3.利用session_set_save_handler()函式是實現自定義會話處理