在PHP / MySQL中统计页面浏览量的最佳方法是什么?
而最好的我的意思是最有效的,现在把它放在我的post.php文件是我能想到的唯一的事情:
$query = mysql_query(" UPDATE posts SET views + 1 WHERE id = '$id' ");
有没有更好的方法,这将消耗更less的服务器资源的方法。 我问,因为如果这是一个小应用程序,我将不会有上述问题,但我正在尝试构build一个将被很多人使用的东西,我希望尽可能具有查询意识。
如果您对保存资源感兴趣并仍然使用SQL进行报告,并且精确的#无关紧要,可以尝试这样的采样(修改采样率以适合您的比例):
$sample_rate = 100; if(mt_rand(1,$sample_rate) == 1) { $query = mysql_query(" UPDATE posts SET views = views + {$sample_rate} WHERE id = '{$id}' "); // execute query, etc }
如果memcache是你的服务器环境中的一个选项,这里有另一个很酷的方式来取样,但也跟上准确的数字(不像我的其他答案):
function recordPostPageView($page_id) { $memcache = new Memcached(); // you could also pull this instance from somewhere else, if you want a bit more efficiency* $key = "Counter for Post {$page_id}"; if(!$memcache->get($key)) { $memcache->set($key, 0); } $new_count = $memcache->increment($key); // you could uncomment the following if you still want to notify mysql of the value occasionally /* $notify_mysql_interval = 100; if($new_count % $notify_mysql_interval == 0) { $query = mysql_query("UPDATE posts SET views = {$new_count} WHERE id = '{$page_id}' "); // execute query, etc } */ return $new_count; }
- 不介意纯粹主义者对辛格尔顿的大骂。 或者你可以把它传递给这个函数,如果你比实用主义更纯粹:)
恕我直言,最好的解决办法是将views_count存储在内存(memcached,无论)中,并在内存中进行更新。 (当然,更新必须同步)
然后你可以使用cron脚本将这些值推到数据库。 (经过一段时间 – 秒,分钟,无论如何)。
你可以在caching中保存一个计数器(比如APC或者Memcache),然后增加计数器。 然后存储更新一次。 如果发生caching重置,您可能会丢失一些视图
其他的解决办法是只保留一个单独的表格(Field:postid,visits)。 这是你可以从MySQL获得更快的速度。 尝试使用InnoDB引擎,因为它提供了行级locking!
你也可以检查这行代码。 这会对我有所帮助,因为你可以用一个tect文件来实现你的目标。 这不需要任何数据库活动。
<?php session_start(); $counter_name = "counter.txt"; // Check if a text file exists. If not create one and initialize it to zero. if (!file_exists($counter_name)) { $f = fopen($counter_name, "w"); fwrite($f,"0"); fclose($f); } // Read the current value of our counter file $f = fopen($counter_name,"r"); $counterVal = fread($f, filesize($counter_name)); fclose($f); // Has visitor been counted in this session? // If not, increase counter value by one if(!isset($_SESSION['hasVisited'])){ $_SESSION['hasVisited']="yes"; $counterVal++; $f = fopen($counter_name, "w"); fwrite($f, $counterVal); fclose($f); } echo "You are visitor number $counterVal to this site";
在数据库中只有一个列的主要关键字定义IP,然后存储在数据库中的IP使用下面的PHP代码:
连接文件:
<?php $conn = mysqli_connect("localhost","root",""); if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $db=mysqli_select_db($conn,"DB_NAME"); if(!$db) { echo "Connection failed"; } ?>
PHP文件:
<?php $ip=$_SERVER['REMOTE_ADDR']; $insert="INSERT INTO `id928751_photography`.`ip` (`ip`)VALUES ('$ip');"; $result = mysqli_query($conn,$insert); ?>
显示次数:
<?php $select="SELECT COUNT(ip) as count from ip;"; $run= mysqli_query($conn,$select); $res=mysqli_fetch_array($run); echo $res['count']; ?>
在数据库中使用这种方法存储所有服务器的ip
注:只有服务器IP可以存储或计数不是设备IP