Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Скрипт Пользователей онлайн (https://forum.antichat.xyz/showthread.php?t=111377)

SXtingeR13 16.03.2009 09:10

Скрипт Пользователей онлайн
 
Кто может поделиться скриптом пользователей онлайн, кто шас на портале показывал цифрами, сколько их шас, не нагружая сервер.

.:EnoT:. 16.03.2009 09:15

А там делать по сути нечего.
Берёшь сессию каждого, берёшь таймстамп и записываешь в БД. При каждом обновлении страницы обновляешь данные и удаляешь записи тех пользователей, которые не проявили активность в течении N минут)
А вывод просто SELECT COUNT (*) и т.д...

AkyHa_MaTaTa 16.03.2009 09:24

Ну таких скриптов прут пруди, забей в гугле, или как написал .:EnoT:. напиши сам.

.:EnoT:. 16.03.2009 09:38

Я думаю лучше запостить пример.


Создаём таблицу:
Код:

CREATE TABLE `sessions` (
  `sid` varchar(32) NOT NULL,
  `lastdate` datetime NOT NULL
) ENGINE=MyISAM;

Сам скрипт:

PHP код:

<?php
session_start
();

$interval 15//Интервал бездействия пользователя в минутах  

$sid session_id(); //Берём ID сессии

$sql mysql_query("SELECT * FROM `sessions` WHERE `sid` = '".$sid."'");


if(
$sql && mysql_num_rows($sql)){
    
    
/*
      Если сессия с таким ID уже записана, обновляем
    */ 
    
mysql_query("UPDATE `sessions` SET `lastdate` = NOW() WHERE `id_session`='".$sid."'");
    
}else{
    
    
/*
      Если нет, добавляем
    */    
    
mysql_query("INSERT INTO `sessions` VALUES('".$sid."', NOW())");
}

/*
  Удаляем записи пользователей не проявивших активность
  в течении времени указанного в $interval
*/

mysql_query("DELETE FROM `sessions` WHERE `lastdate` < NOW() - INTERVAL '".$interval."' MINUTE");


?>


И вывод типа того:
Код:

SELECT COUNT(*) AS `online` FROM `sessions`

bombeg 16.03.2009 09:42

.:EnoT:., прочитай про ON DUPLICATE

.:EnoT:. 16.03.2009 09:54

bombeg, В своих скриптах использую, а это всего лишь пример. Может мне следовало бы ещё класс работы с mysql выложить, что всё было круто? Зачем? Если ТС в этом разбирается он без труда заточит как надо. Или например может добавить IGNORE, ключи...да в общем что угодно

SXtingeR13 16.03.2009 10:22

Думаю вариант не такой

Собственно скрипт:
<?Php
session_start();
define("MAX_IDLE_TIME", 3);
function getOnlineUsers(){
if ( $directory_handle = opendir( session_save_path() ) ) {
$count = 0;
while ( false !== ( $file = readdir( $directory_handle ) ) ) {
if($file != '.' && $file != '..'){
if(time()- fileatime(session_save_path() . '\\' . $file) < MAX_IDLE_TIME * 60) {
$count++;
}
} }
closedir($directory_handle);
return $count;
} else {
return false;
}}
echo 'Пользователей онлайн: ' . getOnlineUsers() . '<br />';
>
Подсчёт пользователей, стоит на месте, сесия необновляеться,
если только таким действием его убивать

session_save_path("/path/to/custom/directory");

А если путь до дир незнаеш как быть?

rcc0023 16.03.2009 11:50

Уф.. предложу другой вариант:
В базе создать таблицу с полями: id,ip,br,date
Там где нужно вывести число онлайн:

Цитата:

<?

$date=time();

$ip=getenv('REMOTE_ADDR');
$br=$_SERVER['HTTP_USER_AGENT'];

$len_online_inbase=mysql_num_rows(mysql_query('SEL ECT id FROM '.$table_online_user." WHERE ip='".$ip."' and br='".$br."' LIMIT 1"));

if($len_online_inbase==1){mysql_query('UPDATE '.$table_online_user.' SET date='.$date." WHERE ip='".$ip."' and br='".$br."' LIMIT 1");}
else{mysql_query('INSERT INTO '.$table_online_user." SET ip='".$ip."',br='".$br."',date=".$date);};

$date_time_out=$date-180; //// 180 - 3 минуты

$len_online_now=mysql_num_rows(mysql_query('SELECT * FROM '.$table_online_user.' WHERE date > '.$date_time_out));

echo 'сейчас: '.$len_online_now.' на сайте';

?>

SXtingeR13 16.03.2009 15:51

Ето понятно, есчё + подключить скрипт, если несложно допиши его, зарание благодарен


Время: 09:29