Я использую токен на основе времени, используя в качестве начального числа год и номер недели, например:
$token = md5($salt + gmdate('YW'));
Вчера в воскресенье токен сломался, время на сервере и клиенте было синхронизировано (вовремя).
Проверив с помощью интерактивного инструмента cli из php, я понял, что число недель, возвращаемых PHP, равно «01» (ноль-один).
например:
Interactive mode enabled
php > echo gmdate('W');
01php > echo date('W');
01php >
На момент публикации пост был 29 декабря в 21:58 по Гринвичу, и со вчерашнего дня в 00:00 по Гринвичу он был прерван.
Проверено на php 5.5.9
Вместо форматирования персонажа Y
использовать o
, который вернет номер года ISO-8601.
Он имеет то же значение, что и Y, за исключением того, что если номер недели ISO (W) относится к предыдущему или следующему году, вместо этого используется этот год. (добавлено в PHP 5.1.0)
Пример:
echo gmdate('oW');
Возможно из-за разных настроек часового пояса или локали. В некоторых странах / стандартах воскресенье считается первым днем недели.
Неделя (дата [режим]);
дата = значение даты. mode = целое число, обозначающее начало
неделя.Arugment по умолчанию равен 0, что является воскресеньем, если установить значение 1,
понедельник, 2 вторник и тд.неделя (дата, 1);
Цитируется из Как установить первый день недели в понедельник при использовании Week (Date) в PHP / MySQL?
Я нашел проблему.
В стандарте ISO-8601 эта неделя является 01, а не последней 2014 года. Это можно проверить Вот:
Проблема в том, что я на клиенте использую функцию, возвращающую 2015 и 1 (а я из PHP использую 2014 и 01 «201401»! == «20151»).