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
'source' 카테고리의 다른 글
다중 컨스트럭터용 자바스크립트 패턴 (0) | 2023.09.19 |
---|---|
문서의 시작 부분에만 XML 선언이 허용됨 (0) | 2023.09.19 |
DATE_SUB의 단위 파라미터에 저장 프로시저 파라미터 사용 (0) | 2023.09.19 |
Internet Explorer 캐싱 asp.netmvcjax 결과 (0) | 2023.09.19 |
JUNIT XML 출력 규격 (0) | 2023.09.19 |