Просмотр полной версии : Скрипт Пользователей онлайн
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`
.: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");
А если путь до дир незнаеш как быть?
Уф.. предложу другой вариант:
В базе создать таблицу с полями: 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
Ето понятно, есчё + подключить скрипт, если несложно допиши его, зарание благодарен
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot