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

Тема в разделе "Как сделать...", создана пользователем verfaa, 16 сен 2013.

  1. verfaa

    verfaa

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

    [​IMG]

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

    Код:
    
    // 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 оставался прежним.
     
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    600
    Симпатии:
    468
    Первое, что приходит в голову - добавить еще один массив $_COOKIE['chat']['recipients_time'] с теми же индексами, что и $_COOKIE['chat']['recipients'].
    Массив это будет содержать дату и время создания конкретного элемента массива.
    Ну, и соответственно, expire устанавливать от этой даты.
     
  3. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    видимо добавлять только нового, остальных не трогать..
    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.']'$respondenttime() + 3600 24 7'/' );
        
     
  4. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Заметил ещё 1 странность, установил действие нескольких COOKIE в пару минут, прошло минут 10, время действия их закончилось, но они не самоуничтожились, попробовал перезагрузить браузер - они все равно остались! Почему?
    Вот скрин, сейчас 16 сентября 2013 20:03
    [​IMG]
     
  5. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    что-то ваш скрин не открывается..

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

    ззы.. домен тоже имеет смысл указывать..
     
  6. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    я понимаю, что неделя, поэтому оставил просто time() + 60

    перезалил на другой хостинг картинок
    [​IMG]
    Вот например chat[recipients][5] и chat[recipients][3] уже давно истекли, а все равно висят. Если навести курсор мыши на дату (уже истекшую) выскакивает надпись "Запрос удалил Cookie". (На не истекших датах такая надпись не появляется) Но если посчитать количество элементов в массиве count($_COOKIE['chat']['recipients']) - то удаленные Cookie (вернее, которые должны быть уже давно удалены) все равно считаются!
    Блин, ну пиз-ц какой-то, везде написано что Cookie удаляются по истечение срока, оказывается не удаляются
     
  7. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    они не пропадают сами по себе - сделайте переход по какой-нибудь ссылке.. на странице, на которую перешли, проверьте их доступность (в массиве $_COOKIE).. так же убедитесь, что вы их где-либо заново не устанавливаете.. и при инициализации указывайте домен явно (не только путь) - помнится были подобные грабли (в опере точно)..
     
  8. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Пробовал и рефрешить страницу и по другим страницам ходил - бестолку...
    Попробовал потестить в chrome (сделал просто вывод print_r($_COOKIE)), до этого тестил в файрфоксе. И что интересно там все работает, как только срок действия куки заканчивается она уничтожается (именно уничтожается, а не продолжает висеть в массиве $_COOKIE дальше).
    Полез обратно в файрфокс и на этот раз посмотрел COOKIE именно через вывод массива COOKIE из скрипта (print_r($_COOKIE))
    И что поразительно там просроченных кук нет! Но самое интересное, что firebug показывает совсем другую картину: в нем отображаются просроченные куки как и раньше. Вот смотрите сами, это одна и таже страница:
    [​IMG]
    сверху вывод print_r($_COOKIE), ниже данные firebug. Объясните как такое может быть???
     
  9. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    видимо держит видимыми для отладки (он же пишет, что они просрочены).. а может и глюк какой, таки люди пишут..

    вообще можете в консоле fb выполнить console.log( document.cookie ) и увидеть реальную картину..
     
    verfaa нравится это.
  10. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    однозначно баг, ну зачем показывать данные, которых нет? Ну если даже для какой-то отладки - пусть хотя бы зачеркнутыми их показывал, а он показывает их так, как будто они есть! И к тому же count считает элементы в массиве $_COOKIE['chat']['recipients'] вместе с удаленными. Гребаный firebug! :mad::mad::mad: