Php Mysql计数器代码优化

Php Mysql计数器代码优化,php,mysql,sql,Php,Mysql,Sql,我有一个很大的下载站点,我有一个更新每次下载的代码,以跟踪每个文件有多少独特的人下载,以及有多少人查看该文件 然而,代码工作得很好,但是当我有很多流量时,代码会减慢站点的速度,这使得mysql服务器可以使用大量资源。这段代码可以优化吗 我会很感激有人为我做这件事,无论是通过内部加入他们等等。谢谢 <?php #Gathers the client info $agent = $_SERVER['HTTP_USER_AGENT']; $brows = explode

我有一个很大的下载站点,我有一个更新每次下载的代码,以跟踪每个文件有多少独特的人下载,以及有多少人查看该文件

然而,代码工作得很好,但是当我有很多流量时,代码会减慢站点的速度,这使得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());
?>

您有5个查询,只是为了更新一个或多或少简单的计数器。在我看来,这是非常重要的

我不知道您的并发用户数量,但我建议采用以下方法:

  • 只需保存一个下载日志,类似于当前的
    log\u点击次数表
  • 每隔一个小时左右运行一个cronjob脚本来生成所需的统计信息,并清除日志表中的旧条目(或者将它们移到其他地方,这取决于您是否仍然需要它们用于其他用途)

这会将每次下载的查询减少到一个。另一方面,统计cronjob每次只使用一个(尽管更昂贵)查询来完成大量(更便宜)查询的工作。总的来说,这将有助于提高页面的响应时间。

请将数据从
$\u服务器['HTTP\u用户\u代理]]
中转义出来,并对数组索引使用引号:
$this['day\u unique']
!哦,好的,我明白了。为了获得更好的性能,还可以做其他事情吗?只需使用:
$agent=mysql\u real\u escape\u string($\u SERVER['HTTP\u USER\u agent')$file\u id
$uip
(=
user\u ip()
)也从外部资源加载,您也必须将其转义。@code 4天在这种情况下,您至少可以删除第9行中的
选择…
语句。您可以通过将最后一行中的
UPDATE…
查询更改为set,例如,
day\u unique=day\u unique+1
而不是
day\u unique='{$unique}'
。我认为您现在在脚本中使用了
$hits
提供的数据。