2012-03-15 2 views
0

큰 다운로드 사이트가 있습니다. 각 파일을 다운로드하는 고유 한 사람 수와 총 사람 수를 추적하기 위해 각 다운로드를 업데이트하는 코드가 있습니다.Mysql 카운터 코드

그러나 코드는 정상적으로 작동하지만 트래픽이 많을 때 코드가 사이트 속도를 늦추고 mysql 서버가 많은 리소스를 사용할 수 있도록 허용합니다. 이 코드가 최적화 될 수 있습니까?

나는

<?php 
    #Gathers the client info 

    $agent = $_SERVER['HTTP_USER_AGENT']; 
    $brows = explode(" ",$agent); 
    $ubr = "$brows[0]"; 
    $exptime = time() + 200; 
    $var = time(); 
    $uip = user_ip(); 

    $del = mysql_query("DELETE FROM log_hits WHERE exptime < '".$var."'"); 
    $hits = mysql_fetch_array(mysql_query("SELECT * FROM user_downloads WHERE id='".$file_id."'")); 

    #Process unique download count 
    $u_check = DB::FetchArray(DB::Query("SELECT COUNT(*) FROM log_hits where browser='".$ubr."' and uip='".$uip."' and file_id='".$file_id."'")); 
    if($file_check[0]=="0") 
    { 
     $res3 = DB::Query("INSERT INTO log_hits SET browser='".$ubr."', uip='".$uip."', exptime='".$exptime."', file_id='".$file_id."'"); 
     $unique = $hits[day_unique] + 1; 
    }else 
    { 
     $unique = $hits[day_unique]; 
    } 

    #update regular hits to the file, 
    $week = $hits[weekly] + 1; 
    $hour = $hits[this_hour] + 1; 
    $todayx = $hits[today_hits] + 1; 
    $total = $hits[total] + 1; 
    $month = $hits[month] + 1; 

    $res3 = DB::Query("UPDATE `user_downloads` SET `day_unique`='{$unique}', `weekly`='{$week}', `this_hour`='{$hour}', `month`='{$month}', `total`='{$total}' , `today_hits`='{$todayx}' WHERE `id`='".$file_id."'") or die(mysql_error()); 
?> 
+2

'$ _SERVER [ 'HTTP_USER_AGENT']'의 데이터를 이스케이프하고 배열 인덱스에 따옴표를 사용하십시오 :'$ this [ 'day_unique']'! – ComFreek

+0

오, 알았어. 더 나은 성능을 위해 다른 작업을 수행 할 수 있습니까? –

+0

$ mysql_real_escape_string ($ _ SERVER [ 'HTTP_USER_AGENT']); ' – ComFreek

답변

2

당신은 단지 더 많거나 적은 간단한 카운터를 업데이트하는 5 개 질문이 감사 등을 결합 내부가 있는지, 나를 위해 그것을 할 사람을 부탁드립니다. 내 opionion에서 이것은 많은 방법입니다.

나는 동시 사용자의 당신의 양에 대해 잘 모르지만, 나는 다음과 같은 접근 방식과 같은 제안 :

  • 그냥 현재 log_hits 테이블과 유사한 다운로드의 로그를 유지합니다.
  • cronjob 스크립트를 실행하여 필요한 통계를 생성하고 이전 항목의 로그 테이블을 지우거나 다른 항목을 필요로하는지 여부에 따라 다른 곳으로 이동하십시오.

이렇게하면 다운로드 할 때마다 검색어가 하나씩 줄어 듭니다. 반면에 통계 cronjob은 (더 비싸지 만) 단일 쿼리를 사용하여 매번 (더 저렴한) 많은 쿼리 작업을 수행합니다. 전반적으로 이것은 귀하의 페이지의 응답 시간을 향상시키는 데 도움이됩니다.

+0

고마워, 나는 실시간으로 끝내기를 원해? –

+0

@ code4_days이 경우 최소한 9 행에'SELECT ...'문을 버리면됩니다. 마지막 행의'UPDATE ... '질의를 변경하여 이것을 바꿀 수 있습니다. 예를 들어'day_unique = day_unique 'day_unique = '{$ unique}'대신'+ 1'을 사용합니다. 나는 그 스크립트에서'$ hits'에 의해 제공된 데이터를 사용한다고 생각합니다. – Sirko

+0

굉장해! 이로 인해 쓸모없는 코드가 제거되었습니다. :) –