PDA

Просмотр полной версии : Скрипт Пользователей онлайн


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
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
Ето понятно, есчё + подключить скрипт, если несложно допиши его, зарание благодарен