DenisUfa,
index.html (или
index.php)
<p id="counter">
<span style="font-size:15px;color:#A9A9A9;padding-left:15px;">сейчас на сайте: <b id="counter-number"><?php include('counter.php'); ?></b></span>
</p>
<script>
(function online() {
fetch("/counter.php").then(async response => {
document.querySelector("#counter-number").textContent = await response.text();
}).finally(() => {
setTimeout(online, 5 * 1000);
});
})();
</script>
counter.php
<?php
$onlineDataFileName = 'online.dat';
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$timeout = 5 + 5;
$data = @file_get_contents($onlineDataFileName);
$visitors = $data === false ? [] : unserialize($data);
$visitors = array_filter($visitors, function ($visitor) use ($time, $timeout, $ip) {
return $visitor['time'] > $time - $timeout && $visitor['ip'] !== $ip;
});
$visitors[] = [
'ip' => $ip,
'time' => $time
];
file_put_contents($onlineDataFileName, serialize($visitors), LOCK_EX);
echo count($visitors);
Перед использованием вам нужно удалить файл
online.dat.
Я не понимаю, почему нельзя было использовать встроенные функции и сериализацию.
Сообщение от laimas
|
Это для кого, если речь об обычном счетчике?
|
Я — не специалист по PHP, в моём примере (который ты только что увидел) что-то не так?
Сообщение от Poznakomlus
|
количество пользователей на сайте вычисляется по значению открытых сессии, если таковы имеются,
число вычисляется не точно, так как пользователь мог отключиться, у него пропал интернет
|
Если
timeout и на сервере и на клиенте одинаковый, то, поскольку идёт постоянный опрос сервера, кол-во онлайн пользователей будет указано с точностью до того отрезка времени!