Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 08.01.2020, 21:48
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от DenisUfa
и вижу счетчики свихнулись
В чём это выражается, как вы это поняли?

Сообщение от DenisUfa
Не подскажите что это?
Это — последствия реализации вашей идеи: «подскажите как подключить вывод PHP скрипта средствами JS с интервалом выполнения каждые 2 секунды (счетчик посетителей)». А вы что ожидали?

Сообщение от Rise
А как надо чтобы существовало [AJAX]?
Никак. AJAX, означает «асинхронный JavaScript и XML» — используется не по назначению, ведь ни о каком «асинхронный JavaScript и XML» нет и речи. Когда используется XMLHttpRequest, fetch, WebSocket и пр., то это называется «общение клиент-сервер». Раз вам так нужно выражение по-английский, которое вы хотите штамповать при любом упоминании клиент-сервер, то это будет — Client-Server Communication.

Всего-то 4 слова — «клиент», «запрос», «сервер» и «ответ». Не нужно усложнять!

Последний раз редактировалось Malleys, 08.01.2020 в 23:09.
Ответить с цитированием
  #12 (permalink)  
Старый 08.01.2020, 23:51
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Malleys
ведь ни о каком «асинхронный JavaScript и XML» нет и речи.
XMLHttpRequest.open(method, url[, async[, user[, password]]])

Сообщение от Malleys
AJAX, означает «асинхронный JavaScript и XML» — используется не по назначению,
JavaScript, означает Java и Script — используется не по назначению, ведь ни о каком Java нет и речи...

Ответить с цитированием
  #13 (permalink)  
Старый 09.01.2020, 00:02
Интересующийся
Отправить личное сообщение для DenisUfa Посмотреть профиль Найти все сообщения от DenisUfa
 
Регистрация: 07.01.2020
Сообщений: 20

Сообщение от Malleys Посмотреть сообщение
В чём это выражается, как вы это поняли?
Число то 50, то 0 показывало резко менялось. Снес на всех страницах, а сервер продолжает выполнять дальше и строчит логи.

[Wed Jan 08 23:58:04.672876 2020] error [pid 29442] [client 91.214.196.209:15552] script '/var/www/user101771/data/www/.ru/save2log.php' not found or unable to stat, referer: http://.ru/voice
[Wed Jan 08 23:58:10.936889 2020] error [pid 29507] [client 212.58.114.253:15686] script '/var/www/user101771/data/www/.ru/save2log.php' not found or unable to stat, referer: http://.ru/voice
[Wed Jan 08 23:58:21.714776 2020] error [pid 29617] [client 31.173.166.26:15850] script '/var/www/user101771/data/www/.ru/save2log.php' not found or unable to stat, referer: http://.ru/voice
Ответить с цитированием
  #14 (permalink)  
Старый 09.01.2020, 00:18
Интересующийся
Отправить личное сообщение для DenisUfa Посмотреть профиль Найти все сообщения от DenisUfa
 
Регистрация: 07.01.2020
Сообщений: 20

У меня работают вот такие скрипты и никаких проблем. В режиме реального времени. Мне нужно было что-то такое только с посетителями и без использования БД.
function getRate(){
$.getJSON( "https://www.cbr-xml-daily.ru/daily_json.js", function( data ) {
document.getElementById("usdrub").innerHTML = ( (data.Valute.USD.Value).toFixed(2) ) ;
document.getElementById("eurrub").innerHTML = ( (data.Valute.EUR.Value).toFixed(2) ) ;
});
}
setInterval(getRate,1000);
getRate();
Ответить с цитированием
  #15 (permalink)  
Старый 09.01.2020, 00:22
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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 — вы начали жонглировать именами!
Ответить с цитированием
  #16 (permalink)  
Старый 09.01.2020, 00:28
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от DenisUfa
Число то 50, то 0 показывало резко менялось.
Это так сделано в counter.php, что-то там не то с алгоритмом. (Может он не предназначался для «вызов каждые две секунды одним и тем же клиентом», или как скажут модные AJAX-куны: «вызов каждые две секунды одним и тем же аяксом»)

Сообщение от DenisUfa
Снес на всех страницах, а сервер продолжает выполнять дальше и строчит логи.
У кого страница открыта и не перезагружена, до сих пор осталась старая версия.

Последний раз редактировалось Malleys, 09.01.2020 в 00:32.
Ответить с цитированием
  #17 (permalink)  
Старый 09.01.2020, 00:33
Интересующийся
Отправить личное сообщение для DenisUfa Посмотреть профиль Найти все сообщения от DenisUfa
 
Регистрация: 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>";
?>
Ответить с цитированием
  #18 (permalink)  
Старый 09.01.2020, 01:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от DenisUfa
$writedata=fopen($online_data,"w") or die("Не могу открыть файл $online_data");
Это для кого, если речь об обычном счетчике?
Ответить с цитированием
  #19 (permalink)  
Старый 09.01.2020, 02:36
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

здесь неправильная логика
количество пользователей на сайте вычисляется по значению открытых ссесий если таковы имеются
число вычисляется не точно, так как пользователь мог отключиться, у него пропал интернет ...
пока жива ссесия считаем пользователи есть на сайте (время жизни делаем минимальным, по надобности продлеваем)
вариант с вебсокетами также стоит рассматривать
Ответить с цитированием
  #20 (permalink)  
Старый 09.01.2020, 04:32
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проще всего передать переменную из JS в PHP? Zuko AJAX и COMET 13 10.04.2015 18:38
БД, JS и PHP или как всё это сложить lazerru Общие вопросы Javascript 2 15.04.2013 17:20
Как передавать параметры из php скрипта в js imissyouso Общие вопросы Javascript 3 01.08.2012 18:24
есть ли в js понятие частоты кадров, наподобие как во флэше? andrew_F Общие вопросы Javascript 8 01.05.2012 20:25
PHP и JS жонглирование данными McLotos Общие вопросы Javascript 5 14.04.2011 16:16