1. 程式人生 > >多個ajax請求php後端導致反應時間慢解決方案

多個ajax請求php後端導致反應時間慢解決方案

產生的原因

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()函式是實現自定義會話處理