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

И, по большому счету, я имею в виду самые эффективные, прямо сейчас, помещая это в мой файл 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 является наличие view_count, хранящегося в памяти (memcached, независимо), и обновление в памяти. (Конечно, обновления должны быть синхронизированы)

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

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

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

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

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