2012-03-15 3 views
0

У меня есть большой сайт для загрузки, у меня есть код, который обновляет каждую загрузку, чтобы отслеживать, сколько уникальных человек скачивают каждый файл и сколько всего человек просматривает файл.Mysql Counter code optimize

Однако код работает нормально, но когда у меня много трафика, код замедляет работу сайта, разрешает сервер 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() '] (http://php.net/mysql-real-escape-string):' $ agent = mysql_real_escape_string ($ _ SERVER ['HTTP_USER_AGENT']); ' – ComFreek

ответ

2

У вас есть 5 запросов только для обновления более или менее простого счетчика. В моем опионировании это много.

Я не знаю о вашем количестве одновременно работающих пользователей, но я хотел бы предложить что-то вроде следующего подхода:

  • Просто держать журнал о загрузке подобной текущей log_hits таблицы.
  • Каждый час запускает скрипт cronjob для генерации необходимой статистики и очистки журнальных столов старых записей (или перемещение их в другое место, в зависимости от того, нужны ли они вам еще для чего-то еще).

Это уменьшит ваши запросы для каждой загрузки. С другой стороны, статистика cronjob будет использовать только один (хотя и более дорогой) запрос для выполнения работы множества (более дешевых) запросов каждый раз. В целом это должно помочь улучшить время отклика вашей страницы.

+0

Спасибо, я как-то хотел, чтобы это было сделано в реальном времени? –

+0

@ code4_days В этом случае вы можете по крайней мере отказаться от оператора SELECT ... в строке 9. Вы можете заменить это, изменив запрос 'UPDATE ...' в последней строке для установки, например, 'day_unique = day_unique + 1' вместо 'day_unique = '{$ unique}''. Я думаю, вы используете данные, предоставленные '$ hits', теперь здесь, в этом скрипте. – Sirko

+0

потрясающий! Это устранило какой-то бесполезный код. :) –