09.01.2020, 00:22
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от Rise
|
XMLHttpRequest.open(method, url[, async[, user[, password]]])
|
Я и не спорю о том, что вы можете скачать XML. Интересно то, что используя класс XMLHttpRequest можно скачать любой тип данных (даже бинарные!), поэтому я думаю, что в имя этого класса подобрано неудачно — оно только частично описывает его возможности. Если бы я называл этот класс, то я назвал бы, например — Connection. (из-за open и timeout)
Вот ваш пример из сообщения №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 — неудачное название!
Сообщение от Rise
|
JavaScript, означает Java и Script — используется не по назначению, ведь ни о каком Java нет и речи...
|
Нет. Это ты только что произвёл подмену: «JavaScript» === «Java и Script», и соответственно ошибочный вывод.
Однако AJAX, как и написано в официальных источниках, означает именно — “Asynchronous JavaScript + XML”, и этим термином многие веб-программисты замещают одновременно и «коммуникация клиент-сервер» и «POST-запрос» и «ответ от сервера» и иногда они сами не знают, что имеют в виду!
И заметьте, Rise, вы ничего не смогли объяснить (как и многие другие) насчёт AJAX — вы начали жонглировать именами!
|
|
09.01.2020, 00:28
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от DenisUfa
|
Число то 50, то 0 показывало резко менялось.
|
Это так сделано в counter.php, что-то там не то с алгоритмом. (Может он не предназначался для «вызов каждые две секунды одним и тем же клиентом», или как скажут модные AJAX-куны: «вызов каждые две секунды одним и тем же аяксом»)
Сообщение от DenisUfa
|
Снес на всех страницах, а сервер продолжает выполнять дальше и строчит логи.
|
У кого страница открыта и не перезагружена, до сих пор осталась старая версия.
Последний раз редактировалось Malleys, 09.01.2020 в 00:32.
|
|
09.01.2020, 00:33
|
Интересующийся
|
|
Регистрация: 07.01.2020
Сообщений: 20
|
|
Может проще в самом 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>";
?>
|
|
09.01.2020, 01:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от DenisUfa
|
$writedata=fopen($online_data,"w") or die("Не могу открыть файл $online_data");
|
Это для кого, если речь об обычном счетчике?
|
|
09.01.2020, 02:36
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
здесь неправильная логика
количество пользователей на сайте вычисляется по значению открытых ссесий если таковы имеются
число вычисляется не точно, так как пользователь мог отключиться, у него пропал интернет ...
пока жива ссесия считаем пользователи есть на сайте (время жизни делаем минимальным, по надобности продлеваем)
вариант с вебсокетами также стоит рассматривать
|
|
09.01.2020, 04:32
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
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 и на сервере и на клиенте одинаковый, то, поскольку идёт постоянный опрос сервера, кол-во онлайн пользователей будет указано с точностью до того отрезка времени!
Последний раз редактировалось Malleys, 09.01.2020 в 04:50.
|
|
09.01.2020, 14:31
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Malleys,
что будет если два пользователя одновременно обратятся к файлу?
не следует писать в файлы ничего при высоких нагрузках и одновремменном использовании
память(серверная, memcache ...), база данных
не изобретайте велосипед, колличество активных сессий равно приблизительно количеству активных пользователей
|
|
09.01.2020, 21:59
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Rise, это всё замечательно, сегодня мы знаем, что к нему, следовательно не нужно совершать в каждом предложении «маркетинговые ходы» 25-летней давности. (И тем более не нужно строить логических цепочек на основе идеи Алекса Хопмана!)
А создатель JS сделал всё верно — в чём проблема?
|
|
10.01.2020, 01:12
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от Rise
|
JavaScript – Language, Chrome – Browser,
|
Вы бросаетесь в крайности! И тем более я написал, что, например, можно назвать Connection, но на самом деле можно было бы подобрать более удачное название (например, WebRequest, WWW, Http и пр.), но явно не XMLHttpRequest. Даже просто HttpRequest намного лучше!
Сообщение от Rise
|
цитаты обоих создателей об одном и том же
|
На самом деле нет! Брендан не производит подмен, он даже объясняет почему так назван язык, а Алекс просто взял первое попавшееся слово, которое только было на слуху, и приделал его к названию! Кстати это могла и быть CocaCola... получилось бы — CocaColaHttpRequest.
Представь, как было бы интересно на форуме с темами «не получается через CocaCola отправить данные», «сервер не видит CocaCola», «как отправить CocaCola»... а при поступлении на работу требовали бы знание CocaCola... (Хотя это не было бы интересно. Замени CocaCola (напиток) на AJAX(футбольная команда / унитаз / чистящее средство) и представь как это всё убого в этом мире...)
Ещё раз — это о том, что термин CocaCola AJAX не нужен... используйте подходящие термины «клиент», «запрос», «сервер» или «ответ» как это делают программисты в других языках программирования!
|
|
|
|