Можем ли мы установить cookie в php по времени клиента? - PullRequest
14 голосов
/ 30 января 2012

У меня есть следующие требования:

  1. создать файл cookie для домена сервера
  2. срок действия файла cookie истекает через x секунд, скажем, через 200 или 500 секунд.

Проблема в том, что клиенты могут отставать от сервера на столько же, сколько минут. На стороне сервера я устанавливаю cookie как

setcookie($cooName,$cooVal,time()+500,"/");

но теперь, если клиентский компьютер отстает от сервера на 500 секунд, приведенный выше код превратится в файл cookie, срок действия которого истекает через 1000 секунд, а не через 500 секунд.

Я думал отправить клиенту метку времени на сервер и установить cookie в это время. как то так:

setcookie($cooName,$cooVal,$_GET['clientTS']+500,"/");

Но если клиент отстает на 500 секунд, и если я установил такой файл cookie, который задним числом, он не будет установлен. Как добиться временной синхронизации между клиентом и сервером в случае истечения срока действия cookie?

1 Ответ

10 голосов
/ 30 января 2012

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

Это также причина, по которой первая стандартизация IETF исходного предложения Netscape заменила абсолютную дату истечения относительным сроком действия.date, атрибут Max-Age , который указывает время в дельта-секундах с момента, когда был выпущен файл cookie. RFC 2965 , который устарел RFC 2109, сделал то же самое.Как и RFC 6265 , это самая последняя спецификация для файлов cookie.

Файлы cookie в соответствии с RFC 6265 также позволяют указывать дату истечения срока как для относительной даты, используя Макс.-Age и абсолютная дата с использованием Expires , последний в основном для обратной совместимости:

Если файл cookie имеет атрибуты Max-Age и Expires, то Max-Age атрибут имеет приоритет и управляет датой истечения срока действия куки.

Таким образом, вы можете написать свою собственную функцию, которая имитирует это поведение:

$maxage = 12345;
$expires = date(DATE_COOKIE, time()+$maxage);
header("Set-Cookie: $name=$value, Expires=$expires, Max-Age=$maxage, …");

Вот примерфункция:

function set_cookie($name, $value=null, $maxage=null, $path=null, $domain=null, $secure=false, $httponly=false) {
    $cookie = rawurlencode($name) . '=' . rawurlencode($value);
    $attributes = array();
    if (!is_null($maxage)) {
        $maxage = intval($maxage);
        $attributes[] = 'Expires='.date(DATE_COOKIE, $maxage > 0 ? time()+$maxage : 0);
        $attributes[] = 'Max-Age='.$maxage;
    }
    if (!is_null($path)) {
        $attributes[] = 'Path='.rawurlencode($path);
    }
    if (!is_null($domain)) {
        $attributes[] = 'Domain='.rawurlencode($domain);
    }
    if ($secure) {
        $attributes[] = 'Secure';
    }
    if ($httponly) {
        $attributes[] = 'HttpOnly';
    }
    header('Set-Cookie: '.implode('; ', array_merge(array($cookie), $attributes)), false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...