Вопрос по установке $_COOKIE

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
416
Реакции
49
На сайте есть чат, где пользователи общаются 1-на-1.
Этот чат создаёт массив $_COOKIE['chat']['recipients'] в котором хранит id пользователей с которыми общается юзер (чтобы он мог переключатся меду ними)

3af1f1bb3a4b1e7bc72ea0fe94ec5166.png


Создание массива в скрипте имеет следующий вид:

Код:
// ID пользователя с которым нужно открыть чат обычно приходит из GET
$respondent = isset($_REQUEST["resp"]) ? intval($_REQUEST["resp"]) : "";

if($respondent) {

    $_COOKIE['chat']['recipients'][] = $respondent;
    $_COOKIE['chat']['recipients'] = array_unique($_COOKIE['chat']['recipients']);
    sort($_COOKIE['chat']['recipients']);

    foreach($_COOKIE['chat']['recipients'] as $k => $v) {
        setcookie('chat[recipients]['.$k.']', $v, time() + 3600 * 24 * 7, '/' );
    }

Чат самопис, код писал не я. Только что обнаружил проблему - при добавлении нового пользователя в список (т.е. нового элемента в массив $_COOKIE['chat']['recipients']) срок окончания действия всех COOKIE в массиве $_COOKIE['chat']['recipients'] изменяется на текущий (понятно почему, мы foreach проходим по итоговому массиву и обновляем expire у всех элементов). Но это противоречит всякой логике.

Подскажите пожалуйста как сделать, чтобы при добавлении нового элемента в массив $_COOKIE устанавливался expire только для него, а для всех остальных элементов из этого массива expire оставался прежним.
 
Первое, что приходит в голову - добавить еще один массив $_COOKIE['chat']['recipients_time'] с теми же индексами, что и $_COOKIE['chat']['recipients'].
Массив это будет содержать дату и время создания конкретного элемента массива.
Ну, и соответственно, expire устанавливать от этой даты.
 
видимо добавлять только нового, остальных не трогать..
PHP:
// ID пользователя с которым нужно открыть чат обычно приходит из GET
$respondent = isset($_REQUEST["resp"]) ? intval($_REQUEST["resp"]) : "";

if($respondent) {
    $recipients_cnt = ! empty( $_COOKIE['chat']['recipients'] ) ? sizeof( $_COOKIE['chat']['recipients'] ) : 0;

    $_COOKIE['chat']['recipients'][ $recipients_cnt ] = $respondent;

     setcookie('chat[recipients]['.$recipients_cnt.']', $respondent, time() + 3600 * 24 * 7, '/' );
 
Заметил ещё 1 странность, установил действие нескольких COOKIE в пару минут, прошло минут 10, время действия их закончилось, но они не самоуничтожились, попробовал перезагрузить браузер - они все равно остались! Почему?
Вот скрин, сейчас 16 сентября 2013 20:03
b1c3070e971f5380516281a70c343e2b.png
 
что-то ваш скрин не открывается..

зы.. time() + 3600 * 24 * 7 - это +неделя, если что..

ззы.. домен тоже имеет смысл указывать..
 
я понимаю, что неделя, поэтому оставил просто time() + 60

перезалил на другой хостинг картинок
a13289860ba0d13495f3c4950b8092ce.png

Вот например chat[recipients][5] и chat[recipients][3] уже давно истекли, а все равно висят. Если навести курсор мыши на дату (уже истекшую) выскакивает надпись "Запрос удалил Cookie". (На не истекших датах такая надпись не появляется) Но если посчитать количество элементов в массиве count($_COOKIE['chat']['recipients']) - то удаленные Cookie (вернее, которые должны быть уже давно удалены) все равно считаются!
Блин, ну пиз-ц какой-то, везде написано что Cookie удаляются по истечение срока, оказывается не удаляются
 
они не пропадают сами по себе - сделайте переход по какой-нибудь ссылке.. на странице, на которую перешли, проверьте их доступность (в массиве $_COOKIE).. так же убедитесь, что вы их где-либо заново не устанавливаете.. и при инициализации указывайте домен явно (не только путь) - помнится были подобные грабли (в опере точно)..
 
Пробовал и рефрешить страницу и по другим страницам ходил - бестолку...
Попробовал потестить в chrome (сделал просто вывод print_r($_COOKIE)), до этого тестил в файрфоксе. И что интересно там все работает, как только срок действия куки заканчивается она уничтожается (именно уничтожается, а не продолжает висеть в массиве $_COOKIE дальше).
Полез обратно в файрфокс и на этот раз посмотрел COOKIE именно через вывод массива COOKIE из скрипта (print_r($_COOKIE))
И что поразительно там просроченных кук нет! Но самое интересное, что firebug показывает совсем другую картину: в нем отображаются просроченные куки как и раньше. Вот смотрите сами, это одна и таже страница:
3cef8a570f1ded941e92eb06920ac52c.png

сверху вывод print_r($_COOKIE), ниже данные firebug. Объясните как такое может быть???
 
видимо держит видимыми для отладки (он же пишет, что они просрочены).. а может и глюк какой, таки люди пишут..

вообще можете в консоле fb выполнить console.log( document.cookie ) и увидеть реальную картину..
 
однозначно баг, ну зачем показывать данные, которых нет? Ну если даже для какой-то отладки - пусть хотя бы зачеркнутыми их показывал, а он показывает их так, как будто они есть! И к тому же count считает элементы в массиве $_COOKIE['chat']['recipients'] вместе с удаленными. Гребаный firebug! :mad::mad::mad:
 
Назад
Сверху