|
|
|
| Объясните как можно реализовать эту систему на файлах. На мускуле к сожалению не могу
Я вот как понял. У нас есть файл online.dat . Сначала мы устанавливаем идентификатор сессии (id) и время визита. Как только посетитель зашел мы ищем этот id в файле. Если там его нет, то записываем id и время визита в файл. Если же такой id присутствует в файле заменяем просто время. И потом соответсвенно эти идентификаторы выводить. Т.е количество id и будет количество человек. Как сделать так чтобы, когда посетитель ушел со страницы id и время стерлось, т.е как определить что он ушел со страницы ?
И вообще я правильно рассуждаю или нет ?
Спасибо | |
|
|
|
|
|
|
|
для: Sl
(28.04.2007 в 13:54)
| | при запуске скрипта просто стирайте из файла записи у которых время на N минут меньше, чем time(). невозможно определить, когда юзер ушел | |
|
|
|
|
|
|
|
для: bronenos
(28.04.2007 в 13:59)
| | Пролистал многие ссылки, но ничего путного не нашел.
Вот код, который я написал. Он добавляет данные и обновляет время. Но он пока не очищает список от ненужных данных
function users_online() {
$online_buf = '';
# Получаем идентификатор
$online_id = session_id();
# Определяем статус юзера
$user = status_user($user);
# Определяем время
$online_date = date("H:i:s");
# Формируем данные в строку
$st = "$online_id|$user|$online_date";
# если файл еще не был создан, создаем
if(!file_exists('data/online.dat')) {
$f = fopen('data/online.dat','w');
fclose($f);
}
$online_file = file('data/online.dat');
# Если файл пустой
if(!$online_file) {
$f = fopen('data/online.dat','a+');
fwrite($f,$st."\n");
fclose($f);
}
# Если файл не пуст
else {
# Проверка на существующий идентификатор сессии
foreach($online_file as $val) {
$online_line = explode('|',$val,3);
list($sid,$status,$time) = $online_line;
# Если идентификатор присутствует, то меняем его время на новое
if($sid == $online_id) {
$resid = $online_id;
$reuser = status_user($reuser);
$retime = date("H:i:s");
$online_buf.= "$resid|$reuser|$retime\n";
$update = true;
}
else $online_buf.= $val;
}
# Если обновление было, перезаписываем файл
if($update) {
$f = fopen('data/online.dat','w');
fwrite($f,$online_buf);
fclose($f);
}
# Если идентификатор старый не обнаружен, добавляем в базу
else {
$f = fopen('data/online.dat','a+');
fwrite($f,$st);
fclose($f);
}
}
}
function status_user($user) {
if(isset($_COOKIE['userbook']))
$user = $_COOKIE['userbook'];
else $user = 0;
return $user;
}
|
>при запуске скрипта просто стирайте из файла записи у которых время на N минут меньше, чем time(). невозможно определить, когда юзер ушел
Можете написать код этого действия, пожалуйста. Я например хочу чтобы если дата у идентификатора была на 20 минут больше то очищаем идентификатор.
Не врубаюсь я вообще как это сделать ( | |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 09:33)
| | вот например так
если данные хранятся в виде: IP время
<?php
$name = 'online.dat';
$limit = 20;
$list = file ($name);
foreach ($list as $id=>$item)
{
list ($ip, $time) = explode (' ', trim($item));
if ($time < $limit*60) unset ($list[$id]);
}
$fp = fopen ($name, 'w');
fwrite ($fp, implode('', $list));
fclose ($fp);
?>
|
| |
|
|
|
|
|
|
|
для: bronenos
(29.04.2007 в 10:19)
| | а как должна выглядеть дата ?
Допустим у меня так написано - 19:30
Если я напишу 19:30 < 1200, то разве это сработает ?
Или нужно убрать двоеточия? Тогда будет 1930 | |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 10:42)
| | лучше записывать время не date(), а time() | |
|
|
|
|
|
|
|
для: bronenos
(29.04.2007 в 10:46)
| | но если писать time(), то она никогда не будет меньше 1200. Там чуть ли не 8 цифр | |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 10:51)
| | Сохраняйте метку входа тоже функцией time(), тогда проверка будет примерно такой
<?php
..
//$reg_time - время входа
if (time() > $reg_time + $limit * 60)
//лимит превышен
...
?>
|
| |
|
|
|
|
|
|
|
для: ddhvvn
(29.04.2007 в 11:00)
| | что значит время входа ? $reg_time. Я как понял $reg_time это обычный time() но ведь он уже задействован в коде
Тогда можно записать так сразу
if(time() > time() + $limit * 60)
|
| |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 11:05)
| | я вам код выше написал с учетом использования именно этой функции
так что можете брать ее | |
|
|
|
|
|
|
|
для: ddhvvn
(29.04.2007 в 11:00)
| | А гоню. $reg_time это наверное зарегистрированное время (time) из файла =) | |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 10:51)
| | Может так сделать. Это будет правильно или нет ?
Вычтем текущий time() от записанного time() в файле. Если результат больше чем 1200, то значит прошло 1200 сек. (т.е 20 минут) | |
|
|
|
|
|
|
|
для: Sl
(29.04.2007 в 11:01)
| | А я Вам про что говорил?!
Именно так! | |
|
|
|
|
|
|
|
для: ddhvvn
(29.04.2007 в 11:10)
| | Да все понял. Спасибо всем огромное. Очень помогли ) | |
|
|
|
|