Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно подойти к написанию скрипта "Список пользователей онлайн", С чего начать?
 
 автор: method   (07.06.2005 в 18:23)   письмо автору
 
 

Выкладывал я этот вопрос на одном форуме, существеной помощи не
получил, может здесь подскажут..... всё это для чата.....



И ещё вопрос: можно ли убить сессию если знать её идентификатор?

   
 
 автор: Akira   (07.06.2005 в 18:42)   письмо автору
 
   для: method   (07.06.2005 в 18:23)
 

> И ещё вопрос: можно ли убить сессию если знать её идентификатор?
Сессия "убиваеться" на машине клиента т.е. session_destroy() будет уничтожать ту сессию которая была последней открыта на машине клиента.
Теперь шаги.
1) Бд в которой храниться ip, индитификатор сессии и время последнего посещения.
2) Создаем скрипт , который регистрирует всез пришедших. Если ip пришедшего юзера уже есть в бд, то обновляем его время пребывания. Если нет , то вносим его в бд.
3) Пишем скрипт , который будет запускаться (cron'ом или по другому) и удалять тех пользователей чье время прибывании на сайте меньше установленного (~ 15 мин.)
Хочу отметить, что например для WAP это не актуально ;) Там работаем не через ip, а через session_id.
Удачи.

   
 
 автор: OZ_забыл_пароль   (22.06.2005 в 05:26)   письмо автору
 
   для: Akira   (07.06.2005 в 18:42)
 

Хочу заметить, что куки для wap вообще не актаульны, т.к пропускаются оператором в заисимости от настроения.

   
 
 автор: cheops   (07.06.2005 в 21:20)   письмо автору
 
   для: method   (07.06.2005 в 18:23)
 

Решение вы можете найти в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=196

   
 
 автор: method   (08.06.2005 в 03:16)   письмо автору
 
   для: cheops   (07.06.2005 в 21:20)
 

Всем большое спасибо,для разгона вполне достаточно....Lol

cron = только что прочитал программа на UNIX'ах ...........

как сделать что нить наподобие средствами PHP, чтоб скрипт сам запускался в течение определённого времени, не взависимости запрашивает страницу со скриптом юзер или нет, и удалял юзеров из активных по времени...???

ЗЫ: администратору или модераторам: в теме Функция MD5 , как дешифровать? удалите плиз мои большие мессаги со скриптами, я уже редактировал,больше не редактируется.......

к посту прикрепляю оч хороший скрипт....... =)
[поправлено модератором. скрипт удален, т.к. не имеет отношения к обсуждаемой теме]

   
 
 автор: glsv (Дизайнер)   (08.06.2005 в 04:30)   письмо автору
 
   для: method   (08.06.2005 в 03:16)
 

>ак сделать что нить наподобие средствами PHP, чтоб скрипт сам запускался в течение определённого времени, не взависимости запрашивает страницу со скриптом юзер или нет, и удалял юзеров из активных по времени...???

Можно привязать скрипт к какой-нибудь не шибко посещаемой странице. Тогда при заходе посетителей на эту страницу будет проводиться чистка не активных пользователей.
Иначе, только cron.

   
 
 автор: method   (09.06.2005 в 11:03)   письмо автору
 
   для: glsv (Дизайнер)   (08.06.2005 в 04:30)
 

Как убить сессию по её Идентификатору?
если id сессии: 2488180aa03fe81372eb01a8489b5109
то что нужно написать чтоб заансетилась
сессия еменно с этим id?

ЗЫ: в электронной литературе которой я располагаю
ни чего даже похожего нет, потому ни каких эксперементов
не делал, сразу на форум =)

   
 
 автор: cheops   (09.06.2005 в 12:16)   письмо автору
 
   для: method   (09.06.2005 в 11:03)
 

Для уничтожения сессии испльзуется функция session_destroy(), которая должна вызываться в файле, прошитом сессией с данным id.
<?php
  
// Устанавливаем идентификатор сессии
  
session_name("2488180aa03fe81372eb01a8489b5109");
  
// Инициируем сессию
  
session_start();
  
// Уничтожаем сессию
  
session_destroy();
?>

   
 
 автор: method   (17.06.2005 в 14:39)   письмо автору
 
   для: cheops   (09.06.2005 в 12:16)
 

2 cheops:
список онлайн юзеров у меня в чате работает примерно так:
юзер логинится и в файл online.php записывается login|server_time|id сессии.

есть невидимый фрейм который обновляет online.php а именно server_time каждые 10 сек,
невидимый фрейм который удаляет юзеров из онлайн списка по прошествию некоторого времени с момента последнего обращения пользователя к странице : он удаляет юзера из файла online.php и пишет
в чат что он покидает чат(timeout),
в этом же скрипте типо того что вы мне советовали:
session_name("id сессии юзера ");
session_destroy(); ...........
так вот, если закрыть страницу чата, и по прошествии того определенного времени в
строке адресов броузера набрать chat.php то юзер войдёт , сессия не уничтожилась,
и он может общаться со всеми,тока бот уже сообщил что тот покинул чат,
в добавок ко всему его нет в списке онлайн-юзеров........

Как быть?

   
 
 автор: Loki   (17.06.2005 в 15:05)   письмо автору
 
   для: method   (17.06.2005 в 14:39)
 

Это в порядке рассуждения:
я бы завел для пользователя поле chatroom, куда бы заносил id текущей комнаты чата, где находится пользователь. Если робот написал что пользователь вышел, то этому полю присваивается значение 0 (так же робот может сообщать в какую комнату перешел пользователь). Соответственно, пользователь с chatroom==0 не может постить в чат, пока статус его chatroom не изменится. А уж его изменение, как мне кажется, отследить несложно.

   
 
 автор: PHPFan   (17.06.2005 в 15:20)   письмо автору
 
   для: Loki   (17.06.2005 в 15:05)
 

Вот функция чисто на файлах, возвращает число OnLine пользователей. Файл самоочищается при истечении лимита времени и по IP.
function online($name)
{
$file = 'online.txt';
$filearray = @file($file);
foreach ($filearray as $i)
 {
 $k++;
 list($names,$ips,$times) = explode('||',$i);
 if ($times<time()-60)
  {
  $k = $k-1;
  array_splice($filearray,$k,1);
  }
 if ($ips == $_SERVER['REMOTE_ADDR'])
  {
  $k = $k-1;
  array_splice($filearray,$k,1);
  }
 }

// Добавляем себя
$user = $name.'||'.$_SERVER['REMOTE_ADDR'].'||'.time();
$filearray[count($filearray)] = $user;

$fp = @fopen($file,'w');
foreach ($filearray as $i)
 {
 $i = trim($i);
 @fputs($fp,$i."\r\n");
 }
@fclose($fp);
return count($filearray);
}

В итоге в online.txt файле оседает инфа в таком формате:
ИмяЮзера||127.0.0.4||1119007100

   
 
 автор: Loki   (17.06.2005 в 15:33)   письмо автору
 
   для: PHPFan   (17.06.2005 в 15:20)
 

хм... тогда надо добавлять номер комнаты и время выхода. Чтобы удалять пользователей с chatroom==0 и временем выхода больше времени жизни сессии, а до тех пор их просто не показывать онлайн.

   
 
 автор: cheops   (17.06.2005 в 20:44)   письмо автору
 
   для: method   (17.06.2005 в 14:39)
 

А как же он заходит в чат, если он удалён из контрольного списка... если пользователя нет в списке - ему хочешь не хочешь потребуется снова авторизоваться в online.php? Как только бот сообщает, что пользователь покинул чат - следует удалить его из файла, а при обращении к страницам чата смотреть имеется он в файле или нет - если нет, доробо пожаловать на авторизацию login.php - тогда все проблемы сами собой решатся...

   
 
 автор: method   (17.06.2005 в 22:05)   письмо автору
 
   для: cheops   (17.06.2005 в 20:44)
 

сессия жива!!(при закрытии страницы, а не самого браузера).....
можно ли как нить убить сессию по её id из скрипта на самом сервере
при том факте что сервер не мой , а допустим на хостинге бесплатном место нарыл.... =)

   
 
 автор: cheops   (17.06.2005 в 22:09)   письмо автору
 
   для: method   (17.06.2005 в 22:05)
 

Если она сама сдыхать не хочет и удалить её штатными средствами не удаётся, то придётся с этим мириться.

   
 
 автор: method   (18.06.2005 в 01:24)   письмо автору
 
   для: cheops   (17.06.2005 в 22:09)
 

не будем =)....
в этой теме есть ответ на мой вопрос,
ну нам ведь надо всё покароче покампактней и
головой не думать много =)

всем спасибо

   
 
 автор: method   (27.06.2005 в 06:11)   письмо автору
 
   для: method   (18.06.2005 в 01:24)
 

Блин, написал скриптик онлайн пользователей для чата,
и как оказалось он некорректный =(,
подскажите где у меня ошибка.....

при логине если такой юзер есть в БД
проверяется не перезагрузился ли он(окно закрыл или ещё чё учюдил),
или вошёл как новый......
если в одном брозе(когда в чате один пользователь) всё нормально,
когда запускаю в двух трёх брозах начинается чёрти чё,
тот который ребут записывает в файл онлайн себя,
а все остальные стираются ,или всех стирает и ещё пишет себя к
себе записаному в одну строку......=(



<?php
$fp 
file ($on_lines);//файл куда заносятся онлайн пользователи
for ($i 0$i count($fp); $i++){
 
$newfp explode("|"$fp[$i]);
        if ((
$login == $newfp[0]) && (($server_time $newfp[1]) < $period)){//если такой юзер есть в онлайн-листе и время отмеченое там не оффлайн
$reb=true;
         
$log_reb fopen($mes"a");
    
fputs($log_reb"\n$server_time|$say_all|$bot||в чат влетает $login(reboot)|3px|#FFFFFF");//запись в чат что юзер вошел 
  
fclose($log_reb);

        
$newfp[1]=$server_time;
        
$newfp[2]=$id_s;
        
$newfp[3]=$status;
    
$count implode("|",$newfp);
    }
  if(
$reb){
unset(
$newfp);
$buffer .= $count;}
  }
 if(
$reb){
$fr fopen($on_lines,"w");
fputs($fr,$buffer);
fclose($fr);}
clearstatcache();//думал дело как то связано с кешем....и ob_clean(); пробовал....
?>
и foreach делал:
<?php
$users_r 
file($on_lines);
foreach(
$users_r as $line){
$user_r explode("|"$line);
if((
$login == $user_r[0]) && (($server_time $user_r[1]) < $period)){
$reb=true;
$log_reb fopen($mes"a");
    
fputs($log_reb"\n$server_time|$say_all|$bot||в чат влетает $login(reboot)|3px|#FFFFFF");
  
fclose($log_reb);
$user_r[1]=$server_time;
$user_r[2]=$id_s;
$user_r[3]=$status;
$line implode("|",$user_r);
 }
if(
$reb){
unset(
$user_r);
$buffer .= $line;}
}
if(
$reb){
$fr fopen($on_lines,"w");
fputs($fr,$buffer);
fclose($fr);}
clearstatcache();

if(!
$reb){$r_us fopen($on_lines"a");//если юзера не было в списке онлайн
    
fputs($r_us"\n$login|$server_time|$id_s|$status");
   
fclose($r_us);

    
$us_log fopen($mes"a");
    
fputs($us_log"\n$server_time|$say_all|$bot||в чат влетает $login|3px|#FFFFFF");
  
fclose($us_log);}

Header("location:chat.php");
?>


файл онлайн-пользователей
ник|time()|id сессии|статус:

moder|1119836243|b9858f47d071b7213f9f49afabf7c582|moderator
guest|1119836243|b9858f47d071b7213f9f49afabf7c582|user


сначала грешил на IE(6.0.3790.0) и оперу(8.0), установил nescape(7.0) и myie(2 rus) , всё то же....=(

   
 
 автор: cheops   (27.06.2005 в 12:19)   письмо автору
 
   для: method   (27.06.2005 в 06:11)
 

У меня чего-то туго идёт с пониманием работы... а время пользователя в файле онлайн-пользователей обновляется при перезагрузки им странцы?

   
 
 автор: method   (27.06.2005 в 13:06)   письмо автору
 
   для: cheops   (27.06.2005 в 12:19)
 

вот код невидимого фрейма который обновляет время онлайн (каждые 10 сек)
<?php
include("conf.php");
session_start();
//session_set_cookie_params(time()+40);
$login=$_SESSION['login'];
$users file($on_lines);
foreach(
$users as $line){
$user explode("|"$line);
if((
$user[0]==$login)&&(($server_time $user[1]) < $period)){
$user[1]=$server_time;
$line implode("|",$user);
}
unset(
$user);
$buffer .= $line;
}
$fd fopen($on_lines,"w");
fputs($fd,$buffer);
fclose($fd);
?>

   
 
 автор: method   (28.06.2005 в 06:39)   письмо автору
 
   для: method   (27.06.2005 в 13:06)
 

х3 чё делать =(
хоть как скрипт стирает всех в файле онлайн,
и записывает того кто заходит.......
я уже пробовал и циклы делать каждый
на определенную проверку,
ну никак пока чегото...

   
 
 автор: cheops   (28.06.2005 в 11:07)   письмо автору
 
   для: method   (28.06.2005 в 06:39)
 

Посмотрите структуру файла - она не меняется? Т.е. не исчезают ли переводы строк или ещё что-то в этом духе при обновлении?

   
 
 автор: method   (28.06.2005 в 18:04)   письмо автору
 
   для: cheops   (28.06.2005 в 11:07)
 

да есть немного, когда кто нить по тайм-ауту вылетает
в файле остаются пустые строки...
пробовал

<?php
if($line=""){unset ($line);}
?>

чё то не то вышло, ваще ни какого эффекта

   
 
 автор: cheops   (28.06.2005 в 22:04)   письмо автору
 
   для: method   (28.06.2005 в 18:04)
 

А так срабатывает?
<?php 
if($line="\n"){unset ($line);} 
?>

   
 
 автор: method   (29.06.2005 в 07:28)   письмо автору
 
   для: cheops   (28.06.2005 в 22:04)
 

Спасибо cheops , сделал вот так:
if($line!="\n"){
читаем строку в массив 
}

пока вроде нормально,ща начну по новой
писать скрипт на проверку ребута,
а то не чё не выходило затёр к чертям =)

   
 
 автор: method   (29.06.2005 в 11:42)   письмо автору
 
   для: method   (29.06.2005 в 07:28)
 

вопрос может быть и глупый, но я его задам =) :
какое максимальное число символов в строке? сколько их нужно прежде чем
указатель автоматом перейдёт на другую строку?или это фантастика =) lol

   
 
 автор: cheops   (29.06.2005 в 12:20)   письмо автору
 
   для: method   (29.06.2005 в 11:42)
 

Перехода на другую строку не будет никогда, пока вы не укажете его явно при помощи специального символа \n (для UNIX) или \r\n (для Windows).
<?php
  $text 
"Первая строка\r\nВторая строка";
?>

   
 
 автор: method   (30.06.2005 в 04:38)   письмо автору
 
   для: cheops   (29.06.2005 в 12:20)
 

в общем всё кул... =)
блин не знаю чё бы без вас делал,
наверно всё бы ещё с формой регистрации мучался =)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования