Sfortunatamente, Scadenza è una data assoluta e dipende dalla data locale dell'agente utente. Come hai concluso correttamente, questo potrebbe portare a una scadenza imprecisa del cookie.
Questo è anche il motivo per cui prima di standardizzazione IETF di Netscape’s original proposal, ha sostituito la data di scadenza assoluta da una data di scadenza relativa, il Max-Age attributo che specifica il tempo in secondi delta dal punto nel tempo il cookie è stato rilasciato. RFC 2965, quella RFC 2109 obsoleta, ha fatto lo stesso. Proprio come RFC 6265, che è attualmente la specifica più recente per i cookie.
Cookies come da RFC 6265, inoltre, consentono di specificare la data di scadenza sia da una data relativa utilizzando Max-Age e una data assoluta utilizzando Scade, quest'ultimo soprattutto per la compatibilità all'indietro:
Se un cookie ha l'attributo Max-Age e Expires, l'attributo Max-Age ha la precedenza e controlla la data di scadenza del cookie.
Così si potrebbe scrivere la propria funzione che simula questo comportamento:
$maxage = 12345;
$expires = date(DATE_COOKIE, time()+$maxage);
header("Set-Cookie: $name=$value, Expires=$expires, Max-Age=$maxage, …");
Ecco un esempio di funzione:
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);
}
Che in realtà è un'ottima domanda. È possibile generare il JavaScript per farlo, questo è sicuro. Ma sono abbastanza sicuro che non puoi farlo solo in PHP. –
@Truth forse se si imposta il fuso orario sul fuso orario del client? – Mike
Ciò non garantisce ancora che il tempo sarà identico al tempo dell'utente. Solo JavaScript può saperlo (o può passarlo in una forma, ma non contarci se è fondamentale). –