EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

Что-то с cookie, не устанавливается...

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Техническая поддержка
Что-то с cookie, не устанавливается...
Автор Сообщение
communicay



Зарегистрирован: 16.01.2013
Сообщения: 15
Откуда: Россия
2038 Монеты

СообщениеДобавлено: Пн, 08 Дек, 2014 13:07    Заголовок сообщения: Что-то с cookie, не устанавливается... Ответить с цитатой

Добрый день! Не понимаю, что творится с cookie, есть сомнения в том, что на вашем сервере всё делается правильно. Локально (на своём компьютере, на котором установлен Denwer) cookie устанавливаются, а на вашем сервере их не видно. Для проверки испытал такой скрипт:
Код:
<?php
$s = time() + 30;
setcookie('abc', 'my_value', $s);   // куки: запомнить 30 сек.
echo "time = " . time() . "; set cookie 30 sec.: " . $s;
?>   

Локально phpinfo() выводит в "PHP Variables":
variable: _COOKIE["abc"]
value: my_value
На вашем сервере переменной _COOKIE["abc"] вообще не существует. Не скажите, в чём проблема?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


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

120354 Монеты

СообщениеДобавлено: Пн, 08 Дек, 2014 18:18    Заголовок сообщения: Ответить с цитатой

Здравствуйте.
Хостинг тут ни при чем.
Пожалуйста, проверьте время на вашем ПК.
С "короткоживущими" куками есть проблема: если на вашем ПК неправильный часовой пояс, она "умрёт" еще до того, как будет установлена.
Смените часовой пояс на парижский(GMT+0) и проверьте верно ли время, скорректируйте время так, чтобы оно совпадало с "парижским"(см. time.yandex.ru), а затем через изменение часового пояса(а не переводом времени!) скорректируйте время так, чтобы оно совпадало с вашим местным.
Именно из-за подобных эффектов куки сроком жизни менее суток почти никогда в веб-проектах не используются.

Проверить, что cookie действительно устанавливаются(по крайней мере отдаются сервером браузеру) очень просто: используйте инструрменты разработчика (Firebug, chrome dev tools и др.) и посмотрите на заголовок ответа setCookie .
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
communicay



Зарегистрирован: 16.01.2013
Сообщения: 15
Откуда: Россия
2038 Монеты

СообщениеДобавлено: Вс, 14 Дек, 2014 15:50    Заголовок сообщения: Ответить с цитатой

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

Для тестирования написал такой код:
__cnt1.php:
Код:
<?php
include("__cnt.php");
  $s = '<html><head><meta http-equiv="Refresh" Content="2;url=__cnt1.php">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head><body>';
  $s .= show_error();
  $s .= "<a href='__cnt2.php'>cnt2</a></body></html>";
  echo($s);
?>

__cnt2.php:
Код:
<?php
include("__cnt.php");
  $s = '<html><head><meta http-equiv="Refresh" Content="2;url=__cnt2.php">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head><body>';
  $s .= show_error();
  $s .= "<a href='__cnt1.php'>cnt1</a></body></html>";
  echo($s);
?>

__cnt.php:
Код:
<?php
function show_error() {
  $_COOKIE['counter']++;
  setcookie('counter', $_COOKIE['counter'], time() +365*24*3600);
  $s = '<br><br>Счётчик: ' . $_COOKIE['counter'];

  $_COOKIE['tm'] = date("Y/m/d H:i:s");
  setcookie('tm', $_COOKIE['tm'], time() +365*24*3600);
  $s .= '<br><br>Время: ' . $_COOKIE['tm'] . '<br><br>';
  return $s;
}
?>

Они работают так. Страница __cnt1.php обновляется каждые 2 секунды, записываю 2 куки: первая запоминает состояние инкрементального счётчика, вторая – текущие дату и время. На ней есть ссылка для перехода на __cnt2.php, которая с теми же самыми куками делает то же самое, только с неё ссылка на первую. Общий код для обоих скриптов – в __cnt.php.

Когда скрипты работают локально (denwer), то всё в порядке. Теперь запускаем на сервере:http://www.compiler.fsay.net/__cnt1.php

Пока нет переходов с одной страницы на другую, то всё в порядке. Даём счётчику немножко поработать, а потом переходим по ссылке. И видим: счётчик «отпрыгивает» назад, время тоже прошедшее. Но при следующем обновлении страницы и счётчик, и время показывают, что надо.

Не пойму, в чём проблема. В первую очередь надо искать проблемы у себя, в своём коде. Но тут код минимален и фактически взят из учебников.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


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

120354 Монеты

СообщениеДобавлено: Вс, 14 Дек, 2014 16:08    Заголовок сообщения: Ответить с цитатой

Проблемы в логике.

загружаем cnt1
1 2 3 ... 10 <кликаем на ссылку> 11 13 15
загружаем cnt2
11 12

Соль в том, что запрос был сформирован и отправлен со значением 10 и пока ожидался ответ от сервера первая страничка перезагрузилась и в куки записалось 11;


Если у учебнике не объясняют, как именно работают cookie, для каких задач их стоит использовать, а для каких нет, то это плохой, никуда не годный учебник.

На локальном компьютере загурзка страницы происходит пренебрежимо быстро. Поэтому очень сложно получить ситуацию, когда во время загрузки первая страничка уже успела поменять значение пока вторая загружалась.


Любые вопросы к поддержке относительно кук должны строится так:
Делаю setcookie(...), в заголовке Set-cookie уходит "....", а должно уходить ".....";

Всё остальное, это точно не к поддержке хостинга.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
communicay



Зарегистрирован: 16.01.2013
Сообщения: 15
Откуда: Россия
2038 Монеты

СообщениеДобавлено: Пн, 15 Дек, 2014 16:10    Заголовок сообщения: Ответить с цитатой

Хорошо, никуда не торопимся, устанавливаем автообновление не 2 секунды, а 60:
Код:
$s = '<html><head><meta http-equiv="Refresh" Content="60;url=__cnt2.php">…

За это время и сервер должен успеть откликнуться, и скриншоты успеем сделать. И так, делаем первый скриншот и даём скрипту поработать:

Через несколько минут делаем ещё один скриншот

И переходим по ссылке на вторую страницу и делаем скриншот второй страницы

А там – содержимое куки, которое у меня было аж несколько часов назад! Но проходит ещё минута и после обновления мы видим то, что должны были видеть минутой назад:

Проблема действительно в логике. Почему на скриншоте № 3 мы видим то, чего не должно было быть?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


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

120354 Монеты

СообщениеДобавлено: Пн, 15 Дек, 2014 17:34    Заголовок сообщения: Ответить с цитатой

Для чистоты эксперимента сделайте две вещи.
1) выведите на страничку текущее время средствами php (echo date('d.m.y H:i:s'))
2) повторите эксперимент.
Уверен, это прояснит проблему с тем, что браузер мог закешировать предыдущее содержимое этой странички.

PS на эту мысль меня натолкнули заголовки ответа
Date Mon, 15 Dec 2014 17:33:03 GMT
Expires Mon, 22 Dec 2014 17:33:02 GMT

Апач их добавляет автоматически.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
communicay



Зарегистрирован: 16.01.2013
Сообщения: 15
Откуда: Россия
2038 Монеты

СообщениеДобавлено: Вт, 16 Дек, 2014 11:29    Заголовок сообщения: Ответить с цитатой

Изменил код __cnt.php:
Код:
<?php
function show_error() {
  $_COOKIE['counter']++;
  setcookie('counter', $_COOKIE['counter'], time() +365*24*3600);
  $s = '<br>Счётчик: ' . $_COOKIE['counter'];

  $_COOKIE['tm'] = date("Y/m/d H:i:s");
  setcookie('tm', $_COOKIE['tm'], time() +365*24*3600);
  $s .= '<br>Время: ' . $_COOKIE['tm'] . '<br>';
  $s .= 'Время создания страницы: ' . date("H:i:s") . '<br>';
  return $s;
}
?>

Скриншоты, до перехода по ссылке:

После перехода по ссылке:

После обновления (похоже, не первого обновления, а второго):
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


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

120354 Монеты

СообщениеДобавлено: Ср, 17 Дек, 2014 16:29    Заголовок сообщения: Ответить с цитатой

Значит точно кеш.
Внесите такое изменение(аналогично во второй файл) или средствами header подавите заголовок expires
Код:
$s .= "<a href='__cnt1.php'>cnt1</a></body></html>";

$rnd=rand(10000,99999);
$s .= "<a href='__cnt1.php?r={$rnd}'>cnt1</a></body></html>";

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
communicay



Зарегистрирован: 16.01.2013
Сообщения: 15
Откуда: Россия
2038 Монеты

СообщениеДобавлено: Пт, 26 Дек, 2014 07:23    Заголовок сообщения: Ответить с цитатой

Спасибо! Функцией header решил проблему. Теперь не нарадуюсь Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Техническая поддержка Часовой пояс: GMT
Страница 1 из 1

 


Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group