ご無沙汰しております。監督です。

今日は先日障害調査していて気付いた、PHPの微妙な仕様変更のお知らせです。

いろいろ省略して書きますが、クライアントが持っているCookie(の値)を削除したい場合、PHPでは値を設定するときと同じsetcookie関数を使います。

setcookie("nantoka","",time() - 3600,'/');

http://php.net/manual/en/function.setcookie.php
これはマニュアルにも書いてあります。3つめの引数に過去のタイムスタンプを渡す、ということですね。

これで吐き出されるHTTPのヘッダは、これまで以下のような感じでした。

Set-Cookie: nantoka=deleted; expires=Sun, 23-Jan-2011 06:41:30 GMT; path=/
※expiresには「現在のUnixタイムスタンプ - (1年 + 1秒 のタイムスタンプ)」のフォーマットされた日時が設定されます。

これが、PHP 5.3.7くらいから以下のように変更になったようです。
Set-Cookie: nantoka=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/
※expiresには「1秒 のUnixタイムスタンプ」のフォーマットされた日時が設定されます。

なんで今更こんな地味な変更が、と思ったのですが、PHPのリポジトリのコミットログには以下のようなメッセージが。
--
/php/php-src/trunk/ext/standard/head.c

Turns out that more than 1% of users clocks are more than a year out of date, this causes cookies to never get deleted since the date is in the future.

I can only guess its due to batteries on the motherboard being dead.

※超意訳
1%以上のユーザーのマシンの時計が一年以上もズレてることがわかったのさ、んで、これほっとくとクッキー消えんよね。だからやった。マザボの電池切れてるんだろーね。
--

なるほど、と思いつつ、もっと早く誰か気付け、むしろ、最初に1年プラス1秒って決めたヤツ誰だ、と思いました。

いまだにこんなちっちゃな変更が入ることもあるんだよっていう備忘録として。
ではまた。