programing

내 사이트의 고유 방문자를 어떻게 계산합니까?

megabox 2023. 9. 21. 20:13
반응형

내 사이트의 고유 방문자를 어떻게 계산합니까?

홈페이지에서 가장 많이 본 게시물을 보여주기 위해 사용자 게시물에 대한 방문자 집계 시스템을 만들고 있습니다.지금은 방문자 수를 세는 시스템이 있지만 페이지가 새로 고쳐질 때마다 보기가 등록됩니다.Google Analytics를 사용할 수 없습니다.

제가 필요한 것은 독특한 방문객만 셀 수 있는 방문 카운터입니다.저의 경우, 독특함은 하루에 한 사람만 게시물을 볼 수 있다는 것을 의미합니까?일주일이라도 효과가 있을 것 같습니다.여기에 저 php 코드를 써주실 수 있나요?원하시면 좋은 튜토리얼 링크도 주시면 됩니다.

코드가 수행해야 할 작업(또는 동등한 작업)은 다음과 같습니다.

  1. 페이지가 로드되면 방문자가 새것인지 오래된것인지 확인합니다(방법을 모르겠습니다..)
  2. 그가 늙었다면 무시하세요.
  3. 만약 그가 mysql에서 새로운 경우, 보기 = 보기 + 1

여기 멋진 튜토리얼이 있습니다. 여러분이 필요로 하는 것입니다. (출처: coursesweb.net/php-mysql)

온라인 사용자 및 방문자 등록 및 표시

MySQL 테이블을 사용하여 온라인 사용자 및 방문자 수 계산

이 자습서에서는 온라인 사용자 및 방문자 수를 웹 페이지에 등록하고 집계하며 표시하는 방법을 배울 수 있습니다.원칙은 다음과 같습니다: 각 사용자/방문자는 텍스트 파일 또는 데이터베이스에 등록됩니다.웹 사이트의 페이지에 액세스할 때마다 pph 스크립트는 특정 시간(예: 2분)보다 오래된 모든 레코드를 삭제하고 현재 사용자/방문자를 추가하며 남은 레코드 수를 표시합니다.

온라인 사용자 및 방문자를 서버의 파일이나 MySQL 테이블에 저장할 수 있습니다.이 경우 텍스트 파일을 사용하여 기록을 추가하고 읽는 것이 MySQL 테이블에 저장하는 것보다 빠르다고 생각하여 더 많은 요청이 필요합니다.

먼저 MySQL 테이블을 사용하는 방법보다 서버에 텍스트 파일로 기록하는 방법을 제시했습니다.

이 자습서에 제시된 스크립트를 사용하여 파일을 다운로드하려면 -> 온라인 사용자방문자카운트를 클릭합니다.

• 두 스크립트 모두 이 페이지의 아래에 있는 예에서 볼 수 있듯이 ".php" 파일(with) 또는 ".html" 파일(with)에 포함될 수 있지만 서버는 PHP를 실행해야 합니다.

온라인 사용자 및 방문자를 텍스트 파일에 저장

PHP로 서버의 파일에 레코드를 추가하려면 해당 파일에 CHMOD 0766(또는 CHMOD 0777) 권한을 설정해야 PHP가 데이터를 쓸 수 있습니다.

  1. 작성합니다( 있는 (: )userson.txt 시오를 CHMOD 0777 권한 오른쪽 단추로 한(FTP)를 선택합니다.Read,Write,그리고.Execute옵션).
  2. ())usersontxt.php이을 와 하고, php 합니다를 합니다.userson.txt.

;에 대한 코드.

<?php
// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>
  1. 위 스크립트를 ".php" 파일에 포함시키려면 온라인 사용자 및 방문자 수를 표시할 위치에 다음 코드를 추가합니다.

4. ".html" 파일의 온라인 방문자/사용자 수를 표시하려면 다음 코드를 사용합니다.

<script type="text/javascript" src="usersontxt.php?uvon=showon"></script>

이 스크립트(및 아래에 제시된 다른 스크립트)는 $_SESSION에서 작동합니다.사용하는 PHP 파일의 맨 앞에 session_start();를 추가해야 합니다.MySQL 테이블을 사용하여 온라인 사용자 및 방문자 수 계산

MySQL 테이블에 온라인 방문자 및 사용자 수를 등록, 카운트 및 표시하려면 세 개의 SQL 쿼리를 수행해야 합니다.특정 시간보다 오래된 레코드를 삭제합니다.새 사용자/방문자가 있는 행을 삽입하거나, 이미 삽입된 경우 해당 열에 타임스탬프를 업데이트합니다.나머지 행을 선택합니다.다음은 MySQL 테이블("userson"으로 명명됨)을 사용하여 온라인 사용자 및 방문자를 저장하고 표시하는 스크립트의 코드입니다.

  1. 먼저 2개의 열(uvon, dt)로 "users on" 테이블을 만듭니다.uvon 열에는 사용자(로그인한 경우)의 이름 또는 방문자의 IP가 저장됩니다."dt" 열에는 페이지에 액세스할 때 타임스탬프(Unix time)와 함께 숫자가 저장됩니다.
  • 다음 코드를 php 파일에 추가합니다(예: "create_userson.php").

의 .create_userson.php:

<?php
header('Content-type: text/html; charset=utf-8');

// HERE add your data for connecting to MySQ database
$host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

// connect to the MySQL server
$conn = new mysqli($host, $user, $pass, $dbname);

// check connection
if (mysqli_connect_errno()) exit('Connect failed: '. mysqli_connect_error());

// sql query for CREATE "userson" TABLE
$sql = "CREATE TABLE `userson` (
 `uvon` VARCHAR(32) PRIMARY KEY,
 `dt` INT(10) UNSIGNED NOT NULL
 ) CHARACTER SET utf8 COLLATE utf8_general_ci"; 

// Performs the $sql query on the server to create the table
if ($conn->query($sql) === TRUE) echo 'Table "userson" successfully created';
else echo 'Error: '. $conn->error;

$conn->close();
?>
  1. 및 .userson표 (코드에 대한 설명은 스크립트의 주석 참조).
  • php () 합니다에 합니다.usersmysql.php 두 ): MySQL 에 추가해야 $host,$user,$pass,그리고.$dbname.

사용자 myql의 코드입니다.php:

<?php
// Script Online Users and Visitors - coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();         // start Session, if not already started

// HERE add your data for connecting to MySQ database
$host = 'localhost';           // MySQL server address
$user = 'root';                // User name
$pass = 'password';            // User`s password
$dbname = 'database';          // Database name

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)
$vst_id = '-vst-';         // an identifier to know that it is a visitor, not logged user
$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the rows with visitors
$dt = time();                                    // current timestamp
$timeon = 120;             // number of secconds to keep a user online
$nrvst = 0;                                     // to store the number of visitors
$nrusr = 0;                                     // to store the number of usersrs
$usron = '';                                    // to store the name of logged users

// connect to the MySQL server
$conn = new mysqli($host, $user, $pass, $dbname);

// Define and execute the Delete, Insert/Update, and Select queries
$sqldel = "DELETE FROM `userson` WHERE `dt`<". ($dt - $timeon);
$sqliu = "INSERT INTO `userson` (`uvon`, `dt`) VALUES ('$uvon', $dt) ON DUPLICATE KEY UPDATE `dt`=$dt";
$sqlsel = "SELECT * FROM `userson`";

// Execute each query
if(!$conn->query($sqldel)) echo 'Error: '. $conn->error;
if(!$conn->query($sqliu)) echo 'Error: '. $conn->error;
$result = $conn->query($sqlsel);

// if the $result contains at least one row
if ($result->num_rows > 0) {
  // traverse the sets of results and set the number of online visitors and users ($nrvst, $nrusr)
  while($row = $result->fetch_assoc()) {
    if(preg_match($rgxvst, $row['uvon'])) $nrvst++;       // increment the visitors
    else {
      $nrusr++;                   // increment the users
      $usron .= '<br/> - <i>'.$row['uvon']. '</i>';          // stores the user's name
    }
  }
}

$conn->close();                  // close the MySQL connection

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. ($nrusr+$nrvst). '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result
?>
  1. 서버에서 이 두 개의 php 파일을 만든 후 브라우저에서 "create_userson.php"를 실행하여 "userson" 테이블을 만듭니다.

  2. 포함.usersmysql.php온라인 사용자 및 방문자 수를 표시할 php 파일에 파일을 저장합니다.

  3. 또는 ".html" 파일에 삽입하려면 다음 코드를 추가합니다.

이 스크립트를 사용한 예제

• "users on text"를 포함합니다.php 파일에서 php':

<!dotype html>

Counter Online Users and Visitors

• html 파일에 "usersmysql.php" 포함:

<!doctype html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Counter Online Users and Visitors</title>
 <meta name="description" content="PHP script to count and show the number of online users and visitors" />
 <meta name="keywords" content="online users, online visitors" />
</head>
<body>

<!-- Includes the script ("usersontxt.php", or "usersmysql.php") -->
<script type="text/javascript" src="usersmysql.php?uvon=showon"></script>

</body>
</html>

두 스크립트 모두(데이터를 서버의 텍스트 파일에 저장하거나 MySQL 테이블에 저장하는 경우) 다음과 같은 결과를 표시합니다.온라인: 5

방문자: 3명의 사용자: 2명

  • 마르플로
  • 마리우스

독특한 견해는 언제나 깨기 힘든 것입니다.IP를 확인하면 작동할 수 있지만 IP는 두 명 이상의 사용자가 공유할 수 있습니다.쿠키가 실행 가능한 옵션이 될 수 있지만 쿠키가 만료되거나 클라이언트가 수정할 수 있습니다.

고객님의 경우 쿠키를 수정해도 큰 문제가 없을 것 같으니 이런 경우에는 쿠키를 사용하는 것을 추천합니다.페이지가 로드되면 쿠키가 있는지 확인하고 없으면 쿠키를 생성하고 +1을 뷰에 추가합니다.설정되어 있으면 +1을 하지 않습니다.

쿠키 만료 날짜를 원하는 대로 설정합니다(원하는 주 또는 일). 그러면 해당 시간 이후에 만료됩니다.만료 후 다시 고유 사용자가 됩니다!


편집:
여기에 이 공지를 추가하는 것이 좋을 것 같습니다.
2016년 말경부터 IP 주소(정적 또는 동적)는 EU에서 개인 데이터로 간주됩니다.
즉, 합당한 이유가 있는 IP 주소만 저장할 수 있습니다(보기를 추적하는 것이 합당한 이유인지 잘 모르겠습니다.따라서 방문자의 IP 주소를 저장하려는 경우 (특히 GDPR 법이 시행된 후) 어떠한 법도 위반하지 않도록 하기 위해 되돌릴 수 없는 알고리즘으로 해시하거나 암호화하는 것을 권장합니다.

사용자가 새롭거나 오래된 사용자인지 알아보기 위해 사용자 IP를 가져옵니다.

IP 및 방문 타임스탬프에 대한 테이블을 만듭니다.

IP존재하지 않거나 time()-saved_time stamp > 60*60*24(1일 동안)를 선택하고 IP의 타임스탬프를 다음으로 편집합니다.time()(지금 means) 그리고 보기 1을 늘립니다.

그렇지 않으면, 아무것도 하지 않습니다.

FYI : 사용자 IP가 저장됨$_SERVER['REMOTE_ADDR']변수

"Best answer" 코드를 편집했지만, 유용한 것이 누락된 것을 발견했습니다.또한 프록시를 사용하는 경우 또는 단순히 서버에 프록시 리버스로 nginx가 설치된 경우 사용자의 IP를 추적합니다.

나는 이 코드를 그의 스크립트에 함수의 맨 위에 추가했습니다.

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

그 후 그의 코드를 편집했습니다.

다음을 나타내는 선을 찾습니다.

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

그리고 이것으로 대체합니다.

$uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $adresseip. $vst_id;

이거면 돼요.

다음은 무슨 일이 생기면 전체 코드입니다.

<?php

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
$adresseip = getRealIpAddr();

// Script Online Users and Visitors - http://coursesweb.net/php-mysql/
if(!isset($_SESSION)) session_start();        // start Session, if not already started

$filetxt = 'userson.txt';  // the file in which the online users /visitors are stored
$timeon = 120;             // number of secconds to keep a user online
$sep = '^^';               // characters used to separate the user name and date-time
$vst_id = '-vst-';        // an identifier to know that it is a visitor, not logged user

/*
 If you have an user registration script,
 replace $_SESSION['nume'] with the variable in which the user name is stored.
 You can get a free registration script from:  http://coursesweb.net/php-mysql/register-login-script-users-online_s2
*/

// get the user name if it is logged, or the visitors IP (and add the identifier)

    $uvon = isset($_SESSION['nume']) ? $_SESSION['nume'] : $_SERVER['SERVER_ADDR']. $vst_id;

$rgxvst = '/^([0-9\.]*)'. $vst_id. '/i';         // regexp to recognize the line with visitors
$nrvst = 0;                                       // to store the number of visitors

// sets the row with the current user /visitor that must be added in $filetxt (and current timestamp)

    $addrow[] = $uvon. $sep. time();

// check if the file from $filetxt exists and is writable

    if(is_writable($filetxt)) {
      // get into an array the lines added in $filetxt
      $ar_rows = file($filetxt, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      $nrrows = count($ar_rows);

            // number of rows

  // if there is at least one line, parse the $ar_rows array

      if($nrrows>0) {
        for($i=0; $i<$nrrows; $i++) {
          // get each line and separate the user /visitor and the timestamp
          $ar_line = explode($sep, $ar_rows[$i]);
      // add in $addrow array the records in last $timeon seconds
          if($ar_line[0]!=$uvon && (intval($ar_line[1])+$timeon)>=time()) {
            $addrow[] = $ar_rows[$i];
          }
        }
      }
    }

$nruvon = count($addrow);                   // total online
$usron = '';                                    // to store the name of logged users
// traverse $addrow to get the number of visitors and users
for($i=0; $i<$nruvon; $i++) {
 if(preg_match($rgxvst, $addrow[$i])) $nrvst++;       // increment the visitors
 else {
   // gets and stores the user's name
   $ar_usron = explode($sep, $addrow[$i]);
   $usron .= '<br/> - <i>'. $ar_usron[0]. '</i>';
 }
}
$nrusr = $nruvon - $nrvst;              // gets the users (total - visitors)

// the HTML code with data to be displayed
$reout = '<div id="uvon"><h4>Online: '. $nruvon. '</h4>Visitors: '. $nrvst. '<br/>Users: '. $nrusr. $usron. '</div>';

// write data in $filetxt
if(!file_put_contents($filetxt, implode("\n", $addrow))) $reout = 'Error: Recording file not exists, or is not writable';

// if access from <script>, with GET 'uvon=showon', adds the string to return into a JS statement
// in this way the script can also be included in .html files
if(isset($_GET['uvon']) && $_GET['uvon']=='showon') $reout = "document.write('$reout');";

echo $reout;             // output /display the result

SQL 스크립트에서 아직 테스트하지 않았습니다.

$user_ip=$_SERVER['REMOTE_ADDR'];

$check_ip = mysql_query("select userip from pageview where page='yourpage'  and userip='$user_ip'");
if(mysql_num_rows($check_ip)>=1)
{

}
else
{
  $insertview = mysql_query("insert into pageview values('','yourpage','$user_ip')");

  $updateview = mysql_query("update totalview set totalvisit = totalvisit+1 where page='yourpage' ");
}

문제가 있으면 talkerscode 공식 튜토리얼에서 코드를 입력하세요. http://talkerscode.com/webtricks/create-a-simple-pageviews-counter-using-php-and-mysql.php

언급URL : https://stackoverflow.com/questions/18799808/how-do-i-count-unique-visitors-to-my-site

반응형