Цитата:
Вот ваш пример из сообщения №3 setInterval(function (el) { var connection = new Connection(); connection.open('GET', '/counter.php'); connection.timeout = 60000; connection.onload = function () { el.textContent = this.responseText }; connection.send(); }, 61000, document.querySelector('#counter'));Конечно можно подобрать и более удачное имя класса, но однозначно понятно, что XMLHttpRequest — неудачное название! Цитата:
Однако AJAX, как и написано в официальных источниках, означает именно — “Asynchronous JavaScript + XML”, и этим термином многие веб-программисты замещают одновременно и «коммуникация клиент-сервер» и «POST-запрос» и «ответ от сервера» и иногда они сами не знают, что имеют в виду! И заметьте, Rise, вы ничего не смогли объяснить (как и многие другие) насчёт AJAX — вы начали жонглировать именами! |
Цитата:
Цитата:
|
Может проще в самом PHP коде прописать чтобы обновлялось через интервал и подключить как раньше к странице?
<?php include ('online.php'); ?> Сам код PHP: <?php $online_data="online.dat"; $time=time(); $now=(int)(time()/86400); $past_time=time()-600; $readdata=fopen($online_data,"r") or die("Не могу открыть файл $online_data"); $online_data_array=file($online_data); fclose($readdata); if(getenv('HTTP_X_FORWARDED_FOR')) $user=getenv('HTTP_X_FORWARDED_FOR'); else $user=getenv('REMOTE_ADDR'); $d=count($online_data_array); for($i=0;$i<$d;$i++) { list($live_user,$last_time)=explode("::","$online_data_array[$i]"); if($live_user!=""&&$last_time!=""): if($last_time<$past_time): $live_user=""; $last_time=""; endif; if($live_user!=""&&$last_time!="") { if($user==$live_user) { $online_array[]="$user::$time\r\n"; } else $online_array[]="$live_user::$last_time"; } endif; } if(isset($online_array)): foreach($online_array as $i=>$str) { if($str=="$user::$time\r\n") { $ok=$i; break; } } foreach($online_array as $j=>$str) { if($ok==$j) { $online_array[$ok]="$user::$time\r\n"; break;} } endif; $writedata=fopen($online_data,"w") or die("Не могу открыть файл $online_data"); flock($writedata,2); if($online_array=="") $online_array[]="$user::$time\r\n"; foreach($online_array as $str) fputs($writedata,"$str"); flock($writedata,3); fclose($writedata); $readdata=fopen($online_data,"r") or die("Не могу открыть файл $online_data"); $online_data_array=file($online_data); fclose($readdata); $online=count($online_data_array); echo "<span style=font-size:15px;color:#A9A9A9;padding-left:15px;>сейчас на сайте: <b>$online</span>"; ?> |
Цитата:
|
здесь неправильная логика
количество пользователей на сайте вычисляется по значению открытых ссесий если таковы имеются число вычисляется не точно, так как пользователь мог отключиться, у него пропал интернет ... пока жива ссесия считаем пользователи есть на сайте (время жизни делаем минимальным, по надобности продлеваем) вариант с вебсокетами также стоит рассматривать |
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. Я не понимаю, почему нельзя было использовать встроенные функции и сериализацию. Цитата:
Цитата:
|
Malleys,
что будет если два пользователя одновременно обратятся к файлу? не следует писать в файлы ничего при высоких нагрузках и одновремменном использовании память(серверная, memcache ...), база данных не изобретайте велосипед, колличество активных сессий равно приблизительно количеству активных пользователей |
Rise, это всё замечательно, сегодня мы знаем, что к нему, следовательно не нужно совершать в каждом предложении «маркетинговые ходы» 25-летней давности. (И тем более не нужно строить логических цепочек на основе идеи Алекса Хопмана!)
А создатель JS сделал всё верно — в чём проблема? |
Цитата:
Цитата:
Представь, как было бы интересно на форуме с темами «не получается через CocaCola отправить данные», «сервер не видит CocaCola», «как отправить CocaCola»... а при поступлении на работу требовали бы знание CocaCola... (Хотя это не было бы интересно. Замени CocaCola (напиток) на AJAX(футбольная команда / унитаз / чистящее средство) и представь как это всё убого в этом мире...) Ещё раз — это о том, что термин |
Часовой пояс GMT +3, время: 19:55. |