2009-07-12 4 views
1

jQuery Ajax를 사용하여 비동기 요청을 수행하는 경우 응답이 800 밀리 초, 경우에 따라 느려지고 응답이 2.50 초 (평균)로 반환되는 경우가 있습니다. , 그리고 그냥로드 이미지를 보여줍니다. 내 PHP 코드 또는 jQuery Ajax 코드 때문인지 확실하지 않습니다. 내가 jQuery를 Ajax를 사용하여 일부 값을 보내 jQuery Ajax 요청의 가변 응답 속도

function get_detail_product(obj) 
{  
    var id = obj.id ; 
    var $this = jQuery('#'+id); 
    var Thumb = jQuery('#Scroller div.Container') ; 
    jQuery.each(Thumb , function(){ 
     jQuery(this).css('border' , '#ccc 2px solid'); 
    }); 
    $this.parent().css('border' , '#ff8500 2px solid') ; 
    var load_area = jQuery('.detail') ; 
    //ajax request 
    load_area.html(""); 
    load_area.html('<div id="loading" style="margin-top:60px;margin-left:350px;"><img src="../images/loading.gif"><br>Loding ... </div>'); 
    jQuery.ajax({ 
     url: 'index.php?module=product&popup=on ', 
     type: 'POST', 
     data: 'pid=' + id ,   
     success: function(result) { 
      jQuery('#response').remove(); 
      load_area.html(result); 
      jQuery('#loading').fadeOut(500, function() { 
       jQuery(this).remove(); 
      }); 
     } 
    }); 
} 

과 PHP 파일에 I가 요청 된 데이터를 검색하는 코드를 다음 한

:

//ajax requests 
if(isset($_POST['subcatid']) && is_numeric($_POST['subcatid'])) 
{ 
    $subcatid = $_POST['subcatid'] ; 
    $products = $dbc->getAll("select * from xxproduct where xsubcatid='$subcatid'") ; 
    //send result 
    echo '<table cellpadding="0" cellspacing="0" border="0" id="ScrollerTable"><tr>'; 
    foreach ($products as $p) : echo '<td><div style="border:#ccc 2px solid ; padding:0px;margin-top:20px ; margin-bottom:20px ; margin-left:8px ; margin-right:8px;" class="Container"><a href="javascript:void(0)" id="'.$p['xproductid'].'" onclick="get_detail_product(this)" ><img src="imgsize.phpw=100&h=100&img=../uploads/product/'.$p['xproductid'].'/'.$p['xproductid'].'__1.jpg" border="0"/></a><div style="background-color:#ccc ;text-align:center ; padding:5px; ">'.$p['xproductname'].'</div></div></td>'; 
    endforeach ; 
    echo ' </tr></table>'; 
} 

당신이 내 코드에서 어떤 실수를 찾을 수 있는지 궁금해을 그 지연을 야기한다. 또한 PEAR DB 객체를 사용하여 데이터베이스와 상호 작용합니다.

이 페이지에서 내 질문 제목을 입력하면 약 500ms 후에 제안 사항이 반환됩니다. 왜이 아약스 상호 작용이 그렇게 빠르지 만 내 것이 아닌가?

답변

0

FireBug를 통해 응답 시간 (800ms - 2.5s 언급 한 내용)을 얻고 있다고 가정합니다. 그렇다면 요청 자체의 시간입니다. 이 시점에서 모든 개발자 토지 JS가 이미 실행되었고 실행중인 JS는 ajax() 함수의 jQuery 코드입니다.

그래서 나는 그것이 당신의 PHP 코드라고 합리적으로 확신 할 수 있다고 생각합니다.

내가 할 수있는 것은 약간의 PHP microtime() 호출을 사용하고 (브라우저 또는 명령 줄에서 아약스 호출을 통하지 않고) 해당 스크립트를 직접 누르고 미세 결과를 출력하는 것입니다. 마지막에이

$start = microtime(true); 

그리고 :

특히, 스크립트의 상단에이를 추가 할 것

echo "Time: " . (microtime(true) - $start); 

을 그리고, 등/PARAMS 동안 사용되는 것을 분리하려고 일관되게 느린 쿼리. CRUD 앱의 대부분의 경우와 마찬가지로 DB가 가장 자주 원인입니다.

편집 :

코드를 좀 더 자세히보고 후, 분명히 아무 문제가 없습니다. 내가 이것이 이상한 반응 시간을 가진 유일한 요청인지 궁금합니다. 그렇다면 클라이언트와 서버 간의 연결이 문제가되지 않는다는 것을 의미합니다. 특히이 스크립트입니다.

그리고 제가 아약스 호출이 아닌 브라우저를 통해 스크립트를 직접 치는 것으로 위에서 언급 한 것을 수행함으로써 PHP 코드를 분리 한 다음 해당 미세 문 배치를 이동하여 특정 행을 분리합니다. 암호.

하지만 나라면 SQL 쿼리에 먼저 집중할 것입니다. 대부분 APC와 같은 바이트 코드 캐싱을 사용하지 않는 것 같습니다. 지금은 널리 사용되지 않는 훌륭한 도구입니다.

코드가 사용하는 유일한 캐싱 메커니즘은 아마도 MySQL 쿼리 캐시 일 것입니다. subcatid 필드에 인덱스가 없으면 MySQL이 테이블 스캔을 수행하고있을 수 있습니다. 그러나 다음 번에 동일한 subcatid 값을 사용하여 동일한 쿼리를 요청하면 결과가 쿼리 캐시에 저장되며 MySQL은 즉시이를 반환합니다.바로 복사 AJAX 호출 PHP 코드를 잊고 해당 쿼리를 붙여, 일부 유효한 subcatid 값에 연결하고 phpMyAdmin을하거나 MySQL의 CLI 또는 직접 실행 :

당신은 더 분리하여이를 테스트 할 수 좋아하는 MySQL 도구. 새롭고 다른 subcatid 값을 플러그인 할 때 간헐적 인 성능을 보게되면 문제가있는 곳을 알 수 있습니다.

+0

네, 덕분에 해결책을 찾겠습니다. great recommendation;) seprate ajax가 php 파일을 호출하므로 더 나은 결과를 얻습니다. – mehdi

0

아마도 브라우저와 PHP mem-caching 모두에서 캐싱 중일 수 있습니다.

0

네트워크 대기 시간은 특히 한쪽 또는 다른 쪽에서 일관된 인터넷 연결이없는 경우 아약스 호출에 큰 영향을 줄 수 있습니다. 문제가 간헐적 인 것 같아서 네트워크 나 캐시를 가능성있는 출처로 제안하는 것이 좋습니다.

+0

Nah, PHP 스 니펫 맨 위에서 if() 문을 놓쳤습니다. 거기에 주입 벡터가 없습니다. –

+0

사실, 나쁘다. 나는 그것을 꺼낼 것이다. – acrosman