IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Помогите с сайтом (https://www.imho.ws/showthread.php?t=84026)

Vaston 18.04.2005 10:37

Помогите с сайтом
 
У меня такая проблема:
Есть что-то на подобие сайта. На этом сайте размещено несколько страниц. Дык вот, как сделать так, чтобы одна из страниц загружалась только одним пользователям, другим в это время должно быть предложено попробовать позже? :yees:

Hubbitus 18.04.2005 10:42

На php полагаю? Если работа с БД идет, то можно просто блокировать полностью (и на чтение) таблицу, с которой работает эта страница, а при обращении проверять блокировку, и посылать ("предлагать попробовать позже").
Если без БД, то можно при обращении просто файлик определенный создавать, а в конце его удалять (ну или записывать в него что-то и читать), и по этому тое в скрипте судить используется страница в данный момент времени или нет.

P.S. А зачем такое может вдруг потребоваться на сайте, если не секрет?

Vaston 19.04.2005 15:52

В принципе не секрет, это часть дипломного проекта "Управление роботом через инет" вот и надо чтоб страница с управляющими командами загружалась тока одним пользователем.
Работа без БД, можешь описать по подробнее... :yees:

Sheryld 19.04.2005 16:27

тогда можно счетчик повесить, аля «кто на сайте», и проверять его, если кто-то есть, тогда блокировать.

Vaston 19.04.2005 16:32

Это то и понятно, но как это сделать? :yees:

Sheryld 19.04.2005 16:49

когда-то писал такую штуку(довольно давно), алгоритм там прост как две копейки.

задается expired-период, т.е. время через которое человек считается покинувший сайт.

при заходе на страницу:

1. каждый раз записывается время и идентификатор человека, если он где-то кликает, то время обновляется(если идентификатор уже есть).
2. удаляются expired-пользователи. т.е. чье последнее время+expired-период меньше чем время сейчас.

минусы:
не дает 100% гарантии что человек именно закрыл браузер.

технологии:
данные можно хранить в бд или в обычном файле.
в качестве идентификатора может служить например:
ip адрес
cookie

можно привлечь сюда сессии.

вариантов море:)

Hubbitus 19.04.2005 21:49

Цитата:

Vaston:
Это то и понятно, но как это сделать? :Ezo!:
Ну вобщем я кратко и описал как это делается выше...

А вообще не проще ли просто каждому выдать уникальный логин/пароль и не мучаться? Тоесть заведомо разрешить доступ только одному авторизованному пользователю, тем самым исключить других!?

Goryn 20.04.2005 01:37

Если речь идет об одной странице, то можно обойтись текстовым файлом. В любом случае прийдется возится со скриптами. Perl или PHP - решай сам.

Самый тупой способ - привязывать страницу к IP-адресу зашедшего. А лучше прописывать инфу ему в куки.

Vaston509 20.04.2005 15:41

Цитата:

Goryn:
А лучше прописывать инфу ему в куки.
А как это сделать можно?
может есть какой нить источник...

Цитата:

Hubbitus:
А вообще не проще ли просто каждому выдать уникальный логин/пароль и не мучаться? Тоесть заведомо разрешить доступ только одному авторизованному пользователю, тем самым исключить других!?
Сначала я пробовал с регистрацией и авторизацией, но сейчас надо просто по другому, ограничить тока одну страницу

Al-x 20.04.2005 18:40

Можно сделать так:
У нас есть файл в котором хранится некое уникальное число(зачем? сейчас расскажу :)) + дата последнего обращения к странице(timestamp).
Когда человек обращается к странице происходит проверка даты последнего обращения.
Если, например, разница больше заданного интервала (скажем, минута), то генерится новое случайное число, записывается в куку пришедшему + перезаписывается файл с новой датой и случайным числом.
Иначе если разница меньше интервала, то читаем из куки клиента число и если оно совпадает, то обновляем дату в файле (можно ещё новое число сгенерить и послать клиенту); иначе отказываем в доступе :)
На PHP делается элементарно. Смотри функции time, rand, fopen/fclose, fwrite/fread, setcookie/$_COOKIES['']. Всё доступно на http://www.php.net/ :)
:beer:

Ale 21.04.2005 01:35

ИМХО: Hubbitus предложил вариант, котор на 100% подходит под условие - создавать файл-блокиратор пока кто-то работает со страницей. Нет смысла городить излишества с куками, базами и др

Vaston509 22.04.2005 09:53

Ale, Хорошо, если без кук, с файлом. Как создавать этот файл блокиратор? Может есть примерчик :yees:

Hubbitus 23.04.2005 21:26

Цитата:

Vaston509:
Ale, Хорошо, если без кук, с файлом. Как создавать этот файл блокиратор? Может есть примерчик :Ezo!:
Примера нету, но чего там и примерить-то? А алгоритм прост как 2 копейки: при заходе на страницу, проверяешь, есть ли определенный файл, если есть (или если дата создания его больше определенного тобой таймаута, об этом чуть ниже) - посылаешь. Если нету - создаешь. Соответственно когда создал, остальные будут посылаться пока он есть. Когда человек выходит с этой страницы - удаляешь этот контрольный файл.
А теперь о таймауте - когда человек загрузил страницу - он может часами ее смотреть и больше ничего не делать, и никакой возможности на сервере узнать закрыл ли он браузер или нет не может быть и речи, поэтому, и нужно ввести этот таймаут. Скажем после 5 минут неактивности (не загружают другие страницы, не тыркают ссылки и т.д.), тоесть когда нет возможности узнать что делает юзверь - будем считать что он ушел, в таком случае другому можно разрешить зайти. И если этот все-таки действительно оказался таким тормозом, и так долго читал пассивно страницу, то теперь ему покажут что типа "занято".
Однако, если это не подходит, то можно и еще один подход применить: На JS создаешь iframe в этой странице, и скажем каждые 5 секунд его обновляешь, тгда можно будет с уверенностью судить о нахождении человека на странице и необрыве соединения...

Vaston509 24.04.2005 13:27

с таймером все понятно; когда пользователь зашел на страницу с созданием файла тоже понятно, но как убить файл, когда он сваливает?

Al-x 24.04.2005 15:06

Если уж стали раскручиваьть этот вариант:
Цитата:

Vatson509:
как убить файл, когда он сваливает?
Давай попробуем ещё раз :)
Когда пользователь заходит на страницу (при проверке timeout). Ещё можно создать ссылку на странице (типа Logout), при обращении к которой файл будет удалён принудительно.
2 All: может кому будет не лень примерчик ему написать, а то тут уже написано текста раза в три больше, чем сам скрипт займёт:)

Vaston509 24.04.2005 19:31

Цитата:

Al-x:
Давай попробуем ещё раз
Когда пользователь заходит на страницу (при проверке timeout). Ещё можно создать ссылку на странице (типа Logout), при обращении к которой файл будет удалён принудительно
Все равно не понятно :(
Но если кто примерчик кинет будет супер... :yees:

Hubbitus 24.04.2005 21:43

Цитата:

Vaston509:
Все равно не понятно :Frown:
Прискорбно.

Цитата:

Vaston509:
Но если кто примерчик кинет будет супер... :Ezo!:
Лови:
PHP код:

<?
session_start();
$timeout = '10'; //Таймаут в секундах

$time = @stat('lock');

    if ($time[9]+$timeout > date('U') and is_file('lock') and file_get_contents('lock')!=session_id()){
    echo 'Извините, страница уже используется';
    }
    else{
    $ff = fopen('lock', 'w');
    fwrite($ff, session_id());
    fclose($ff);
    echo 'Доступ разрешен, страница свободна';
    }
?>

Надеюсь там все понятно, благо все элементарно...

Vaston509 25.04.2005 10:05

При загрузке страницы скрипт выдает мне:
Цитата:

Hubbitus:
date('U') and is_file('lock') and file_get_contents('lock')!=session_id()){ echo 'Èçâèíèòå, ñòğàíèöà óæå èñïîëüçóåòñÿ'; } else{ $ff = fopen('lock', 'w'); fwrite($ff, session_id()); fclose($ff); echo 'Äîñòóï ğàçğåøåí, ñòğàíèöà ñâîáîäíà'; }?>
сам не понимаю в чем ошибка... :(

Hubbitus 25.04.2005 20:27

Цитата:

Vaston509:
При загрузке страницы скрипт выдает мне:...
Он такого кода ну никак не может выдать - моего ника в скрипте уж точно нету. Да и вообще странно это все. Попробуй заменить на длинную форму PHP-тег ("<?" на "<?php"), попробуй file_get_contents заменить на fopen, fread, fclose, если версия PHP у тебя старая очень... кстати, какая версия? Посмотри настройки связанные с сесиями у себя...

Al-x 25.04.2005 22:21

Вообще какие-нибудь скрипты пробовал на сервере запускать?
А то такое ощущение, что версия PHP - никакая :) (если скрипт просто в браузере открыть - это и получим).

Vaston509 25.04.2005 22:50

используется PHP4, к сожелению я не имею доступа к настройкам.
я точно не знаю, но может проблема в сервере - используется Windows XP в роли сервака, но и его я к сожалению тоже изменить не могу. Раньше примерно полгода назад, все это работало на Linuxe, а затем по техническим причинам сервак поменяли и ваще с этой Windoй не доконца понимаю как она работает...
;)

Al-x 26.04.2005 08:47

Код:

<?php
phpinfo();
?>

Покажет все настройки сервака. Результат в студию :)

Vaston509 26.04.2005 09:39

PHP Version 4.3.10

System Windows NT S1M0NE-OLD 5.1 build 2600
Build Date Dec 14 2004 17:46:48
Server API Apache
Virtual Directory Support enabled
Configuration File (php.ini) Path C:\WINDOWS\php.ini
PHP API 20020918
PHP Extension 20020429
Zend Extension 20021010
Debug Build no
Thread Safety enabled
Registered PHP Streams php, http, ftp, compress.zlib

This program makes use of the Zend Scripting Language Engine:
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies




вот вроде бы все настройки

Al-x 26.04.2005 19:00

Вроде ничего необычного (на первый взгляд). на второй тоже :) Единственное, что приходит в голову - ты из какой директории и через какой адрес вызывал "неработающий" скрипт?
Я имею ввиду, что для нормальной работы (если назвать его lock.php) его нужно поместить в папку c:/program files/apache group/apache/users/vaston/lock.php и запрашивать по адресу sziklai.obuda.kando.hu/~vaston/lock.php
Каков результат?

Vaston509 26.04.2005 19:17

Наверное я совсем тормоз, я почему то не подумал, что страница должна называться lock.php, теперь пока все работает, как появится трудности сразу сообщю :yees: :yees: :yees:

Hubbitus 27.04.2005 09:42

Цитата:

Vaston509:
Наверное я совсем тормоз, я почему то не подумал, что страница должна называться lock.php
Да она может называться как угодно, главное чтобы обрабатывалась она на PHP!

Vaston509 27.04.2005 13:55

Не подскажите как удалять файл lock когда пользоваетль покидает страницу... :yees:

Vaston509 27.04.2005 16:30

Как убить файл разобрался unlink, а вот как сделать, чтоб по окончанию $timeout умирал файл и загружалась новая страница????

Ale 27.04.2005 17:38

2 совершенно разных вопроса, однако решение одно :)

Убивать файл нет необходимости, бо скрипт все-равно при каждом запросе проверяет срок годности. Проверить здесь юзер или уже свалил можно заставив браузер отмечаться каждые N сек (напр N=$timeout) для этого напр вставить в заголовок метатег Refresh:
<meta http-equiv=Refresh content=" <?php echo $timeout; ?>; URL=lock.php">
Не оч понятно что такое "управление роботом" - если вдруг обновлять страницу в этом процессе нельзя, придется это делать посредством iframe

Vaston509 28.04.2005 09:18

Если не сложно можно описать вариант с iframe, а то с refreshом не доконца получается, т.к. на странице есть еще другие кнопки (кнопки управления) и когда пользователь кликает на них, то страница обнавляется, соответственно, после обнавления, refresh работает как то не нормально... :yees:

Hubbitus 28.04.2005 10:09

Цитата:

Vaston509:
Не подскажите как удалять файл lock когда пользоваетль покидает страницу... :Ezo!:
Цитата:

Vaston509:
Как убить файл разобрался unlink, а вот как сделать, чтоб по окончанию $timeout умирал файл и загружалась новая страница????
Этого делать совершенно не требуется - в моем скрипте в него пишется идентификатор сесии и проверяется он при каждом запросе, так что ничего вообще тебе мудрить с ним не нужно, все будет работать автоматически.
Цитата:

Vaston509:
Если не сложно можно описать вариант с iframe, а то с refreshом не доконца получается
Просто вписываете в страницу <iframe src=fresh.htm></iframe>, остальные параметры по вкусу, хоть вообще невидимым его делаешь, ну и уже в нем (fresh.htm) вписываешь это обновление страницы через определенный промежуток времени, приблизительно как описал Ale выше..

Vaston509 28.04.2005 10:21

Может быть он и работает правильно, тока у меня почему то происходит следующее:
Я создаю файл lock.php, где записан твой скрипт Hubbitus + вставил require ("sorry.html"); если страница занята и require ("indexb.html"); если доступ разрешен, затем при загрузке страницы "indexb.html" все работает, т.е. загружаешь с другого косма, говорят страница занята, но потом если на первом компе выйти и еще раз зайти, то автоматически доступ разрешается всем. Может я что-то в скрипте не понимаю, можешь объяснить:
$time[10]+$timeout
а точнее мне не понятно $time[10]

А вообще как я разобрался, если этот файл на серваке существует, то доступ почему то имеют все, поэтому я решил его убивать...

Hubbitus 28.04.2005 10:35

Цитата:

Vaston509:
но потом если на первом компе выйти и еще раз зайти, то автоматически доступ разрешается всем.
Не должен всем разрешаться, может я конечно что-то не учел, но проверял и все работало. Что значит на первом компе "выйти и еще раз зайти"?
Цитата:

Vaston509:
можешь объяснить:
$time[10]+$timeout
Конечно я все могу объяснить что написал :p
Цитата:

Vaston509:
а точнее мне не понятно $time[10]
Прежде чем что-то объяснять (а вообще что за лень МАН глянуть!?), посмотри что у меня написано, а именно $time[10] у меня нету, есть $time[9]!!! Скорее всего по этому и не работает как надо!
Ну а теперь объяснение этого собчтвенно: в переменной $time, функцией stat получается массив параметров файла блокировки, к которому я и обращаюсь для получения времени его последнего изменения, собственно 9 элемент!

Vaston509 28.04.2005 10:56

да, так намного лучше.

Но теперь другая проблема, например, устанавливаю я timeout=180, что соответсвует 3 мин.
Если пользователь находится на странице дольше чем 3 мин, то его со страницы не выбрасывает, а другим пользователям доступ открывается.
Я пробовл использовать JavaScript, т.е. счетчик находждения на странице, равный также 3 мин, но так как у меня на странице есть другие кнопки, которые перезагружают эту же страницу то это не работает, т.е. каждый раз по нажатию на кнопку счетчик запускается заново, таким образом пользоваетль в принципе не имеет ограничения.

Может кто-нибудь помочь мне в этом.

Hubbitus 28.04.2005 12:05

Цитата:

Vaston509:
да, так намного лучше.
Как "так"? Правильно скопировав пример???

Цитата:

Vaston509:
Но теперь другая проблема, например, устанавливаю я timeout=180, что соответсвует 3 мин.
Если пользователь находится на странице дольше чем 3 мин, то его со страницы не выбрасывает, а другим пользователям доступ открывается.
А об этом я уже говорил - когда пользователь загрузил страницу и пялится на нее 2 часа, ничего не делая, естественно нет возможности на сервере узнать что он делает, и не ушел ли вообще!!! Для этого и предложено было решение с обновлением iframe.

Короче, насколько я понял, это будет нескончаемо длиться, пока не напишет кто-то готового решения:

Файл lock.php:
PHP код:

<?
session_start();
$timeout = '10'; //Таймаут в секундах

$time = @stat('lock');

    if ( (is_file('lock') and file_get_contents('lock')==session_id()) or $time[9]+$timeout < date('U')){
    $ff = fopen('lock', 'w');    //В любом случае
    fwrite($ff, session_id());    //перезаписываем
    fclose($ff);        //для обновления даты
    echo 'Доступ разрешен, страница свободна';
    echo '<iframe src=fresh.php></iframe>';//Будем поддерживать соединение
    }
    else{
    echo 'Извините, страница уже используется';
    }
?>

Файл fresh.php:
PHP код:

<meta http-equiv=Refresh content="8; URL=fresh.php">
<?
exec('touch lock');
?>

Все проверено, все работает, ничего менять больше не нужно в логике. Естественно можно поменять таймауты и оформление фрейма (думаю его стоит скрыть вообще). Да, таймаут обновления фрейма лучше ставить 80-90% от того что в файле lock.php.

И последнее, в догонку: Если вдруг на сервере нету комманды touch, или вдруг вообще нельзя выполнять комманды, то вместо этого можно просто перезаписать файл тем же самым содержимым.

Vaston509 28.04.2005 16:45

Все теперь все нормально... :yees:

Но теперь я еще хочу сделать так чтоб в статус баре (или же на странице) был таймер, например, 3 мин. Проблема в том, что на странице, как я уже писал раньше есть кнопки "управления" и по нажатию на одну из этих кнопок, вызывается скрипт php, обрабатывается и возвращается на эту же страницу. Дак вот, как сделать так чтоб время таймера не заново начинало идти а продолжало... Конечно если это вообще возможно, то подскажите плизз :yees:

Hubbitus 28.04.2005 19:57

Цитата:

Vaston509:
Но теперь я еще хочу сделать так чтоб в статус баре (или же на странице) был таймер, например, 3 мин. Проблема в том, что на странице, как я уже писал раньше есть кнопки "управления" и по нажатию на одну из этих кнопок, вызывается скрипт php, обрабатывается и возвращается на эту же страницу. Дак вот, как сделать так чтоб время таймера не заново начинало идти а продолжало... Конечно если это вообще возможно, то подскажите плизз :Ezo!:
Не понял о каком таймере идет речь, но если просто на JS какой-то отсчет времени, то метки между загрузками страниц можно просто сохранять в куках пользователя. Ну или в сесии хранить, темболее что она итак уже используется косвенно.

Vaston509 29.04.2005 07:33

Таймар должен быть такой: По истечению этого времени пользователь должен быть отправлен на HomePage.

Как сохранять метки между загрузками страниц?

Hubbitus 29.04.2005 09:18

Цитата:

Vaston509:
Как сохранять метки между загрузками страниц?
Ну вешаешь обработчик на onunload страницы, и по нему записываешь в куку значение таймера. Когда страница снова загрузилась - считываешь это значение из куки, и продолжаешь отсчет времени. Все элементарно.

Как вариант, можно все управление запихнуть в iframe (или просто фреймовую структуру сделать) и не перезагружать просто основную страницу, на которой будет тикать таймер.

Vaston509 29.04.2005 10:43

Хотелось бы использовать такой тиg счетчика, как его можно безболезнено изменить, чтоб записывались cookie, правильно ли я записал? И мне не понятно как читать куки, может подскажешь как и каду вставить?
Код HTML:

<body background='picture\fon.jpeg' onLoad="begintimer()" onunload="setcook()">
<script>
function setcook(){                  //ПРАВИЛЬНО ЛИ ЭТО
curCookie = pl;                        //ПРАВИЛЬНО ЛИ ЭТО
document.cookie = curCookie;    //ПРАВИЛЬНО ЛИ ЭТО
}
var limit="3:00"
if (document.images){
var pl=limit.split(":")
pl=pl[0]*60+pl[1]*1
}
function begintimer(){
if (!document.images)
return
if (pl==1)
document.location="webcam.html"
else{
pl-=1
cmin=Math.floor(pl/60)
csec=pl%60
if (cmin!=0)
ctime=cmin+" min. and "+csec+" sec remains for viewing this page"
else
ctime=csec+" sec remains for viewing this page"
window.status=ctime
setTimeout("begintimer()",1000)
}}
</script>

С фрейми я тоже думал, но вот Hubbitus смотри, что получается:

Есть страницы index.html, в ней расположен iframe, который ссылается на ту же frash.php, где мы и записали наш счетчик,
НО когда юзер кликает на кнопку то перегружается страница index.html и с ней соответсвенно и счетчик..
Может я конечно что-то не так делаю..


Hubbitus если тебе не сложно то модет набросаешь скриптик, у тебя это уж больно хорошо получается...Я пока плохо это умею и не все понимаю..


Часовой пояс GMT +4, время: 14:26.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.