Как подключить PHP по средствам JS с интервалом
Ребят я только всему учусь поэтому не смейтесь) подскажите как подключить PHP по средствам JS с интервалом выполнения каждые 2 сек(счетчик посетителей).
Сейчас подключено к странице так: <?php include ('counter.php'); ?> А надо типа того: <script> function online() { <--тут как правильно подключить php--> } setInterval(online,2000); online(); </script> |
|
DenisUfa, например так...
(function online() {
fetch("/counter.php").then(async response => {
document.querySelector("#counter").textContent = await response.text();
}).finally(() => {
setTimeout(online, 2000);
});
})();
Но лучше всего, чтобы данные обновлялись тогда, когда они реально поменяются. Это можно сделать при помощи EventSource (сервер присылает новое число пользователей) Ещё, конечно, можно при помощи WebSocket. Цитата:
|
Если через JS то у меня выводит на странице строчку целиком вот так:
echo "<span style=font-size:18px;color:#A9A9A9;padding-left:15px;>сейчас на сайте: $online</span>"; Но если подключить просто то все нормально стили выполняются. <?php include ('counter.php'); ?> |
DenisUfa, я думал у вас только число присылается... (Что было бы лучше, с чистыми данными легко работать) Ну тогда вместо textContent тогда используйте innerHTML, или исправьте серверный скрипт!
|
заменил на innerHTML теперь все как хотел заработало! Спасибо большое!
|
Сегодня захожу на сайт и вижу счетчики свихнулись. Решил посмотреть в чем дело и увидел что дисковое пространство переполнено логами))). Этого файла у меня не существует: save2log.php Но вроде был в одном счетчике который я пробовал, но я его удалил. Не подскажите что это?
.access.log 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.2.252 Yowser/2.5 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.3.320 Yowser/2.5 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Linux; Android 9; SM-G965F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.2.252 Yowser/2.5 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.2.252 Yowser/2.5 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.3.320 Yowser/2.5 Safari/537.36" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.72 (Edition Campaign 34)" 31.41.41.1 - - [08/Jan/2020:20:03:02 +0300] "GET /php/online.php HTTP/1.0" 200 363 "http://домен" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 YaBrowser/19.12.2.252 Yowser/2.5 Safari/537.36" .error.log [Wed Jan 08 20:14:56.062731 2020] error [pid 26756] [client 95.30.61.216:54548] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:14:57.315884 2020] error [pid 26791] [client 95.30.61.216:54626] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:00.576285 2020] error [pid 26878] [client 95.179.127.56:54806] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:00.766036 2020] error [pid 26893] [client 95.30.61.216:54812] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:02.459028 2020] error [pid 27082] [client 95.30.61.216:54928] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:03.289195 2020] error [pid 27116] [client 95.30.61.216:54998] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:07.209424 2020] error [pid 27287] [client 178.216.38.255:55286] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:07.723609 2020] error [pid 27300] [client 95.30.61.216:55304] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:10.881870 2020] error [pid 27443] [client 178.163.92.192:55472] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:19.695092 2020] error [pid 27713] [client 95.30.61.216:55916] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:20.993406 2020] error [pid 27750] [client 93.124.57.160:55992] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:24.050131 2020] error [pid 27863] [client 82.193.155.253:56168] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:25.746035 2020] error [pid 27902] [client 95.79.7.134:56282] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:29.337384 2020] error [pid 28119] [client 95.30.61.216:56488] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:34.853143 2020] error [pid 28402] [client 178.163.92.192:56822] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:35.921333 2020] error [pid 28437] [client 95.79.7.134:56896] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:39.155199 2020] error [pid 28560] [client 95.30.61.216:57080] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice [Wed Jan 08 20:15:48.177265 2020] error [pid 28845] [client 95.79.7.134:57550] script '/var/www/user101771/data/www/домен/save2log.php' not found or unable to stat, referer: http://домен/voice |
Цитата:
Цитата:
Цитата:
Всего-то 4 слова — «клиент», «запрос», «сервер» и «ответ». Не нужно усложнять! |
Цитата:
[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 |
У меня работают вот такие скрипты и никаких проблем. В режиме реального времени. Мне нужно было что-то такое только с посетителями и без использования БД.
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();
|
Цитата:
Вот ваш пример из сообщения №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, время: 01:12. |