我想跟踪访问者访问我的网站。当访客到达时
最好通过cookie或通过IP地址跟踪它们?会有一个名为访问者的表,其中访问者_ID及其IP地址或cookie代码。另一个名为"访问"的表,它将每次"访问者"到达网站时,使用visit_id,visitor_id和日期/时间。
如何确定这是新访问还是另一个页面视图?即,网站上的每个页面都将具有此代码,以添加访问者,但是我不希望每次查看页面时都将其记录为新访问。
另一个想法是使用$ _server ['http_referer'],然后我可以告诉访问者不是从我的网站上进行另一个页面视图,但是我不确定这是多么可靠。
所以我想知道我们该怎么做?
最好的方法是使用IP地址和cookie的组合。仅将IP地址保存在不够的情况下,因为当用户使用代理时,它可以经常更改。对于每个页面加载,您都可以使用这样的代码
// Get IP address of user
function getUserIP() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
// Check if cookie exists. If not then set new cookie. Return its value
function getUserCookie() {
if(isset($_COOKIE['visited'])) {
// cookie is already set
} else {
list($usec, $sec) = explode(" ", microtime()); // Micro time!
$expire = time()+60*60*24*30; // expiration after 30 day
setcookie("visited", "".md5("".$sec.".".$usec."")."", $expire, "/", "", "0");
}
return $_COOKIE['visited'];
}
如果没有这些值的访问者,则可以将两个值保存到数据库表访问者,因此您可以说它是唯一的新访问者。如果有这些值之一的访问者,则它正在返回访问者,因此您应该更新访问表。
,但是我认为只有一张桌子好多了,因为您不认识访客。使用单个SQL查询,您将仍然能够区分唯一的访问者,页面浏览量,访问者流动,访问时间等。
我建议使用持久的cookie存储访客信息。
跟踪返回访客
当访问者来到您的网站时,您可以检查他们是否已经在浏览器中有一个visitor_id cookie:
- 如果他们不这样做,请为他们创建访问者ID并将其保存在cookie中,然后使用Ajax将ID发送到您的服务器并在数据库中创建新访问者。
- 如果这样做,您可以通过Ajax查询服务器以获取以前的访问者信息,或将当前会话附加到以前的访问中。在下面的更多信息。
这样,您可以通过识别他们从中访问的浏览器来跟踪单个用户,因为这比其IP或任何其他匿名标识更稳定。
注意:您也可以纯粹使用没有AJAX的PHP的$ _COOKIE进行操作,但是我发现将客户端代码与后端完全分开更舒适。这只是个人喜好的问题。
此
的一些前端伪代码if (haveVisitorCookie) {
getVisitorDataByID(visitorCookie); //some ajax implementation
} else {
createVisitorCookie(); //save to back-end
}
在网站上跟踪用户活动
上面的部分仅涵盖识别新/返回的访问者并持续存在的访客信息。要记录用户在一次访问中的工作,最简单的方法是使用PHP的内置会议。
您需要做的就是在代码开头调用session_start()
,并为访问者分配了一个会话,该会话将保持打开状态,直到访问者保留在网站的任何页面上为止。然后,您可以使用Magic $_SESSION
变量将数据添加到当前会话中。您可以以$_SESSION['key'] = value
的形式存储任何数据。
例如,您可以在每个页面加载上查询当前的会话ID,如果它已经存在,则将当前操作附加到它,否则将其作为来自同一访问者的新访问。
一些后端伪代码
session_start();
if ($visitorID) { //visitorID is sent from your front-end and contains the cookie data
$previousSession = getLastVisitorSession($visitorID);
$currentSession = session_id();
if ($previousSession) {
if ($previousSession === $currentSession) {
// New pageview on same session
} else {
// New session
...
saveNewVisitorSession($visitorID, $currentSession)
}
}
}
奖励积分:您甚至可以通过加载上一次会话来帮助您的用户继续关闭的地方,以防他们没有当前的会话ID,但是有一个访问者ID,并具有以前的会话存储
希望这会有所帮助!
对不起,这并不是所有代码中最漂亮的:),但我想这可能是粗略的。
<?php
//Step over if cookie is
if (!isset($_COOKIE["SITE_VISITED"])) { already set
setcookie('SITE_VISITED', 'X');
$db = mysqli_connect('localhost', 'bfu', '1234', 'visits');
//Do we already have a record in the DB?
$res = mysqli_query($db, sprintf("SELECT * FROM visits WHERE ipaddr='%s';",$_SERVER['REMOTE_ADDR']));
if ($res === FALSE && $res->num_rows = 0) {
//Record in DB not found, let's create one
$res2 = mysqli_query($db, sprintf("INSERT INTO visits('ipaddr','page') VALUES ('%s','%s');",$_SERVER['REMOTE_ADDR'],$_SERVER['REQUEST_URI']));
}
mysqli_close($res);
}
?>