source

PHP/MySQL에서 페이지 뷰를 세는 가장 좋은 방법은 무엇입니까?

ittop 2023. 9. 19. 21:24
반응형

PHP/MySQL에서 페이지 뷰를 세는 가장 좋은 방법은 무엇입니까?

제가 생각할 수 있는 가장 효율적인 방법은 post.php 파일을 지금 제 post.php 파일에 저장하는 것입니다.

$query = mysql_query(" UPDATE posts SET views + 1 WHERE id = '$id' ");

서버 리소스를 덜 소비하는 더 나은 방법이 있을까요?만약 이것이 작은 앱이었다면 위의 내용에는 문제가 없을 것이기 때문에 묻지만, 많은 사람들이 사용할 수 있는 것을 만들기 위해 노력하고 있고 가능한 한 질의 의식을 갖고 싶습니다.

리소스를 절약하면서도 보고를 위해 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;
}
  • 그리고 순수주의자들이 싱글턴에 대해 욕하는 것을 신경쓰지 마세요.아니면 실용주의자보다 순수주의자라면 이 기능으로 전달할 수도 있습니다 :)

IMHO의 가장 좋은 해결책은 views_count를 메모리에 저장하고 메모리에 업데이트를 하는 것입니다. (물론 업데이트는 동기화되어야 합니다.)

그런 다음 cron 스크립트를 사용하면 해당 값을 db.로 푸시할 수 있습니다. (시간이 지나면 -초, 분 등).

데이터베이스에는 열이 하나뿐입니다.ip기본 키를 정의한 다음 아래 PHP 코드를 사용하여 ip를 데이터베이스에 저장합니다.

연결 파일:

<?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);
?>

show count :

<?php
$select="SELECT COUNT(ip) as count from ip;";
$run= mysqli_query($conn,$select);
$res=mysqli_fetch_array($run);
echo $res['count'];
?>

데이터베이스에서 이 메서드를 사용하여 모든 서버 IP 저장

참고: server ip만 장치 ip를 저장하거나 카운트할 수 없습니다.

캐시(APC 또는 Memcache와 같은)에 카운터 배열을 유지하고 그 안에 있는 특정 게시물에 대한 카운터를 늘릴 수 있습니다.그런 다음 업데이트를 한 번씩 저장합니다.캐시 재설정이 발생하면 일부 보기가 손실될 수 있음

다른 방법은 방문 시에만 별도의 테이블을 유지하는 것입니다(필드: postid, 방문).그것이 mysql로부터 얻을 수 있는 가장 빠른 속도입니다.InnoDB 엔진은 행 레벨 잠금 기능을 제공하므로 사용해 보십시오!

이러한 코드 라인을 확인할 수도 있습니다.텍스트 파일 하나만으로도 목표를 달성할 수 있기 때문에 도움이 될 것 같습니다.데이터베이스 작업이 필요하지 않습니다.

<?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";

이렇게 하면 실제 사용자가 웹 사이트를 몇 번 본 것이 아니라 얼마나 많은 사람이 웹 사이트를 본 것인지 알 수 있습니다.

1단계: MySQL에 연결하기

dbconfig.

try
{
    // Returns DB instance or create initial connection
    $pdo = new PDO("mysql:host={$DB_host};port={$DB_port};dbname={$DB_name};charset=utf8mb4",$DB_user,$DB_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
     echo $e->getMessage();
}

2단계: MySQL 테이블 만들기

--
-- Table structure for table `unique_visitors`
--

CREATE TABLE `unique_visitors` (
  `date` date NOT NULL,
  `ip` text COLLATE utf8_unicode_ci NOT NULL,
  `views` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Step3 : IP주소를 이용하여 방문객 카운터를 만듭니다.

<?php
    require_once("dbconfig.php");
    // Returns current date in YYYY-MM-DD format
    $date = date("Y-m-d");
    // Stores remote user ip address
    $userIP = $_SERVER['REMOTE_ADDR'];
    // Query for selecting record of current date from the table
    $stmt = $pdo->prepare("SELECT * FROM unique_visitors WHERE date=:date");
    $stmt->execute(['date' => $date]);

    if(count($stmt->fetchAll()) === 0){
        // Block will execute when there is no record of current date in the database table
        $data = [
            'date' => $date,
            'ip' => $userIP,
        ];
        // SQL query for inserting new record into the database table with current date and user IP address
        $sql = "INSERT INTO unique_visitors (date, ip) VALUES (:date, :ip)";
        $pdo->prepare($sql)->execute($data);
    }else{
        $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
        // Will execute when current IP is not in database
        if(!preg_match('/'.$userIP.'/i',$row['ip'])){
            // Combines previous and current user IP address with a separator for updating in the database
            $newIP = "$row[ip] $userIP";
            $data = [
                'ip' => $newIP,
                'date' => $date,
            ];
            $sql = "UPDATE unique_visitors SET ip=:ip, views=views+1 WHERE date=:date";
            $pdo->prepare($sql)->execute($data);
        }
    }
?>
<?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";

언급URL : https://stackoverflow.com/questions/4762527/what-is-the-best-way-to-count-page-views-in-php-mysql

반응형