Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Браузеры и Cookies (JavaScript, PHP)

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
misnik



Зарегистрирован: 29.07.2005
Сообщения: 5

СообщениеДобавлено: Пт Июл 29 2005 20:03    Заголовок сообщения: Браузеры и Cookies (JavaScript, PHP) Ответить с цитатой

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

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

Итак.

На форуме для отслеживания обновлений в темах и разделах я использую Cookie. Например, при открытии темы записывается следующий "кук": pbcforum_id_s_id_com, где s_id - это ID тему, а значение "кука" равно числу сообщений в теме в данный момент.
При открытии списка тем проверяется равенство "кука" числу сообщений в теме и на основе результата этого сравнения делается вывод о наличии новых сообщений. "Кук" ставится следующим JS-скриптом:

<script>
var to = 5*365*24*60*60*1000;
var expDate = new Date();
expDate.setTime(expDate.getTime() + to);

document.cookie = "pbcforum_id_s_id_com = $s_num; path=/; expires=" + expDate.toGMTString();
</script>\n";

Проверка осуществляется средствами PHP при генерации страницы.

Вроде, все правильно и должно работать.

Однако на практике часть "куков" умирает по непонятным причинам.

Выглядит это так. Захожу на форум, вижу 10 новых тем. Начинаю их просматривать, они становятся прочитанными. Вдруг открываю очередную тему, возвращаюсь к списоку, и вижу, что одна или две темы, которые 1 минуту назад были помечены как прочитанные, теперь отмечены, как имеющие новые сообщения. Начинаю разбираться, смотрю "куки" для данного домена - "кука" с данным ID просто нет (а 2 минуты назад - был, потому что я только что просматривал список и новых сообщений не было).

Можете сами проверить: http://rzforum.ru, откройте по порядку все темы, а потом рефрешните список тем.

И вот это происходит регулярно на всех браузерах (я смотрел в IE, Opera 7.51, Opera 8.01, Firefox). Хотя в теории вроде бы все правильно: "куки" записываются, имена "куков" не совпадают, expires установлены на 5 лет.

Но "куки" пропадают и это факт. А я не знаю, в чем дело: в браузере, который не хочет хранить два десятка "кук" для одного домена, в скриптах, в кривых руках или еще в чем-то.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anvano



Зарегистрирован: 24.03.2005
Сообщения: 58

СообщениеДобавлено: Вс Июл 31 2005 14:04    Заголовок сообщения: Ответить с цитатой

Ты прав, согласно RFC по протоколу HTTP

Количество поддерживаемых Cookie составляет не менее 20 штук. Но и больше делать никто не обязан.



RFC 2109, HTTP State Management Mechanism

Цитата:

6.3 Implementation Limits

Practical user agent implementations have limits on the number and size of cookies that they can store. In general, user agents' cookie support should have no fixed limits. They should strive to store as many frequently-used cookies as possible. Furthermore, general-use user agents should provide each of the following minimum capabilities individually, although not necessarily simultaneously:

at least 300 cookies

at least 4096 bytes per cookie (as measured by the size of the
characters that comprise the cookie non-terminal in the syntax
description of the Set-Cookie header)

at least 20 cookies per unique host or domain name
User agents created for specific purposes or for limited-capacity devices should provide at least 20 cookies of 4096 bytes, to ensure that the user can interact with a session-based origin server.

The information in a Set-Cookie response header must be retained in its entirety. If for some reason there is inadequate space to store the cookie, it must be discarded, not truncated.

Applications should use as few and as small cookies as possible, and they should cope gracefully with the loss of a cookie.

6.3.1 Denial of Service Attacks

User agents may choose to set an upper bound on the number of cookies
to be stored from a given host or domain name or on the size of the
cookie information.



Так что придется тебе искать какой-нибудь другой механизм. Например хранить в Cookie только идентификатор сессии, а всё что с ней связано хранить где-нибудь в БД на стороне сессии.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
misnik



Зарегистрирован: 29.07.2005
Сообщения: 5

СообщениеДобавлено: Вс Июл 31 2005 18:50    Заголовок сообщения: Ответить с цитатой

Спасибо за ответ.

>> Так что придется тебе искать какой-нибудь другой механизм. Например хранить в Cookie только идентификатор сессии, а всё что с ней связано хранить где-нибудь в БД на стороне сессии.

Да, пожалуй.
Хотелось бы еще уточнить - вы упомянули БД как абстрактный ресурс или у вас есть основание полагать, что лучше использовать, скажем, mysql (или другую конкретную СУБД)?

Я спрашиваю, потому что с сессиями в таком виде раньше не работал, а сейчас в свете этой темы начал читать документацию по php-sessions и вроде это как раз то, что нужно - никакого дополнительного программинга и управления хранением и обработкой данных. Однако меня несколько пугает невозможность (трудность технической реализации) организации чистки такого хранилища, если с этим нельзя будет справится стандартными функциями, задающими время хранения кеша. (возможно, это чушь - просто я еще не начал пробовать, но перед этим хотел бы определиться с алгоритмом и тем, какие решения далее буду использовать)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anvano



Зарегистрирован: 24.03.2005
Сообщения: 58

СообщениеДобавлено: Пн Авг 01 2005 09:37    Заголовок сообщения: Ответить с цитатой

Я имею ввиду организацию хранения сессий в базе MySQL (PostgreSQL).
В большинстве форумных движков, например, именно так и реализовано.

Кстати реализация не так уж и сложна. В любой нормальной книжке по PHP можно найти целиком исходники класса по управлению сессиями через БД (точно видел в такой толстой красной книжке с кучей фотографий авторов на обложке и большими желтыми буквами PHP).

По поводу чистки. Идентификаторы сессий при обычном их использовании хранятся ввиде файлов на сервере в каталоге TEMP. Внутри этих файлов собственно и хранятся переменные сессий и их значения. Естественно чистку этих файлов никто не производит. Обычно для этого вешают скрипт на crontab, который раз в сутки чистит /temp

С точки зрения хранения в БД проблема чистки решается намного гибче. В той реализации класса по управлению сессиями, которую я упомянул есть механизм задания таймаута. А чистка производится в момент любого обращения к данному классу.
То есть пока на сайт никто не заходит - пусть всё в базе так и лежит, а как только произошло обращение к механизму управления сессиями, он делает delete из базы всех сессий, у которых вышел срок годности, и только потом продолжает работу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
misnik



Зарегистрирован: 29.07.2005
Сообщения: 5

СообщениеДобавлено: Ср Авг 03 2005 15:33    Заголовок сообщения: Ответить с цитатой

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

Я уже реализовал этот вариант. Вроде, все нормально. Можно задать время жизни сессии и кук, указать директорию для временных файлов и т.д. Таким образом, имеется та же функциональность как и при использовании БД и пришлось дописать всего 10 строк кода.
Сейчас тестирую.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anvano



Зарегистрирован: 24.03.2005
Сообщения: 58

СообщениеДобавлено: Ср Авг 03 2005 15:47    Заголовок сообщения: Ответить с цитатой

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

Я уже реализовал этот вариант. Вроде, все нормально. Можно задать время жизни сессии и кук, указать директорию для временных файлов и т.д. Таким образом, имеется та же функциональность как и при использовании БД и пришлось дописать всего 10 строк кода.
Сейчас тестирую.


Да в общем-то ничего плохого нет, если хостинг твой собственный. На некоторых хостингах идет принудительная очистка /temp каталогов с некоторым периодом, чтобы место не засорять. Соответственно удаляются идентификаторы сессий, и пользователь зайдя на следующий день на страницу оказывается "забытым" и не зарегистрированным.

Этого недостатка лишена система хранящая сессии в базе данных.


То есть если у тебя на сайте нет ничего, что использует БД, то конечно можно ограничиться файловым способом хранения, ставить БД только ради сессий смысла нет.
Но если у тебя на сайте есть хоть что-то, что уже не может работать без БД (форум какой-нибудь, или свои собственные скриптики), то тогда какая разница, где хранить сессии.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
misnik



Зарегистрирован: 29.07.2005
Сообщения: 5

СообщениеДобавлено: Ср Авг 03 2005 15:59    Заголовок сообщения: Ответить с цитатой

Я поспешил. Судя по всему, эти функции задают параметры кеширования страниц клиентом/прокси. Всего навсего.

По поводу удаления данных заботливым провайдером - от этого можно спастить, задав директорию, отличную от дефолтной.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...