【问题标题】:logging visitors online for large traffic website在线记录访问者以获取大流量网站
【发布时间】:2011-04-30 18:32:08
【问题描述】:

我管理着一个流量相当大的网站。在每个页面上,我们通过运行以下代码来跟踪在线访问者。然后我们有一个 cron 来删除早于 X 分钟的记录。

 if(!isset($_SESSION[users_online_id])) {
 if(!(date('H')=='02' && date("i") >= 37 && date("i") <= 45)) {
 # NEW VISITOR - DOESN'T HAVE A USER_ONLINE_ID
  $update_query = "INSERT INTO online SET
  ip_address = '".$visitors_ip_address."',
  datetime = now(),
  user_id = ".$visitor_id.",
  page = '".escape($_SERVER[REQUEST_URI])."',
  area = '".$this_area."',
  type = ".$visitor_type;
  mysql_query($update_query);

  # SET THEIR SESSION VAR FOR NEXT PAGE CHECKING
  $_SESSION[users_online_id] = mysql_insert_id();
 }
     }
     else{
 # USER HAS A SESSION

 # CHECK THAT THE RECORD STILL EXIST
 $check_record = "SELECT COUNT(1) FROM online WHERE id = ".$_SESSION[users_online_id];
 $check_record = mysql_query($check_record);

 if(mysql_result($check_record,0) > 0){
  # IF RECORD STILL EXISIT ( WAS NOT DELETED) UPDATE IT
  $update_query = "UPDATE online SET 
  datetime = now(),
  user_id = ".$visitor_id.",
  page = '".escape($_SERVER[REQUEST_URI])."',
  type = '".$visitor_type."',
  area = '".$this_area."',
  ip_address= '".$visitors_ip_address."'
  WHERE id = '".$_SESSION[users_online_id]."'";
  mysql_query($update_query);
 }
 else if(!(date('H')=='02' && date("i") >= 37 && date("i") <= 45)){
  # IF RECORD WAS DELETED (TO LONG ON 1 PAGE), INSERT A NEW RECORD
  $update_query = "INSERT INTO online SET
  ip_address = '".$visitors_ip_address."',
  datetime = now(),
  user_id = ".$visitor_id.",
  page = '".escape($_SERVER[REQUEST_URI])."',
  area = '".$this_area."',
  type = ".$visitor_type;
  mysql_query($update_query);
  $_SESSION[users_online_id] = mysql_insert_id();
 }
      }

在进行一些性能监控时,我注意到与该表交互的查询开始需要更长的时间来执行。关于如何改进这方面的任何想法?

【问题讨论】:

    标签: php mysql optimization performance query-optimization


    【解决方案1】:

    您可以消除 SELECT 查询并使用 UPDATE 查询和 mysql_affected_rows() 函数。

    【讨论】:

      【解决方案2】:

      小点但是...

      $_SERVER['REQUEST_URI'] 比 $_SERVER[REQUEST_URI] 快 7 倍

      还要确保将 id 设置为主键。

      【讨论】:

      • 同样 $_SESSION['users_online_id']
      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2013-11-29
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2012-12-15
      相关资源
      最近更新 更多