Подтвердить что ты не робот

Каков наилучший способ подсчета просмотров страниц в PHP/MySQL?

И, к лучшему, я имею в виду самые эффективные, прямо сейчас, когда это место в моем файле post.php - единственное, что я могу придумать:

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

существует лучший способ, который будет потреблять меньше ресурсов сервера. Я спрашиваю, потому что, если это было небольшое приложение, у меня не было бы проблем с вышеизложенным, но я пытаюсь создать что-то, что будет использоваться многими людьми, и я хочу быть как можно более сознательным.

4b9b3361

Ответ 1

Если вы заинтересованы в сохранении ресурсов и по-прежнему используете 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
}

Ответ 2

Если 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;
}
  • И не возражайте против пуристов, плачащих о том, как синглтоны. Или вы можете передать его в эту функцию, если вы более пурист, чем прагматист:)

Ответ 3

Лучшим решением IMHO является наличие view_count, хранящегося в памяти (memcached, что угодно), и делать обновления в памяти. (Конечно, обновления должны быть синхронизированы)

Затем вы можете использовать cron script, который подталкивает эти значения к db. (через некоторое время - секунды, минуты, что угодно.)

Ответ 4

вы также можете проверить эти строки кода. Это будет полезно, я думаю, потому что вы можете достичь своей цели только с помощью файла 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";

Ответ 5

Вы можете сохранить контр-массив в кеше (например, APC или Memcache) и увеличить счетчик для определенных сообщений в этом. Затем сохраняйте обновления один раз. Вы можете потерять некоторые представления, если кэш- reset имеет

Другим решением было бы сохранить отдельную таблицу только для посещений (Поле: postid, посещения). Это то, что вы можете получить от mysql. Попробуйте использовать движок InnoDB, поскольку он обеспечивает блокировку на уровне строк!

Ответ 6

в базе данных есть только один столбец 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-устройство ip