Действительно ли возможно подать заявку PHP, думают, что дата и время сервера смещается большой настраиваемой суммой (как 6 месяцев назад, или 6 месяцев с этого времени)?
Фон: у Нас есть веб-приложение, которое имеет дело со спортивными мероприятиями, и прямо сейчас мы хотели бы выполнить его в нашей среде разработки таким способом, которым веб-сайт думает, что это - Осень 2009 года вместо Лета 2010 года. Поэтому у нас есть большие данные с прошлогоднего Осеннего сезона, и сезон этого года еще не запустился, так тестирование новых возможностей было бы легче со ставридами реальных данных вместо того, чтобы составить новые данные тестирования на 2010.
Мы не хотим на самом деле изменять дату и время сервера. Текущий наилучший вариант, кажется, для изменения всей даты (), вызовы в коде к my_date () и затем иметь my_date () добавляют смещение к фактической системной дате.
Казалось, что эта функция будет полезна в аналогичных ситуациях для других, таким образом, мне было просто любопытно, существует ли более легкий способ сделать это глобально через некоторый параметр конфигурации, не изменяя код. Я сделал RTM.
Вы можете установить Runkit на сервере разработки и переопределить все необходимые функции dateTime, чтобы они возвращали измененное значение, например
if(APP_ENV === 'testing') {
include 'datetime-monkeypatches.php';
}
где datetime-monkeypatches.php
будет содержать ваши исправления для требуемых функций. Таким образом, вам не придется менять свой фактический код. Это похоже на использование адаптера к исходным функциям, и пока вы храните их в этом отдельном файле, он остается обслуживаемым.
Другой вариант - использовать http://antecedent.github.io/patchwork
Patchwork - это библиотека PHP, которая позволяет переопределять определяемые пользователем функции и методы во время выполнения, слабо копируя функциональность.
runkit_function_redefine
в чистом коде PHP 5.3, который, помимо прочего, позволяет заменять статические и частные методы тестовыми двойниками.
Вы можете использовать собственный класс DateTime:
class My_DateTime extends DateTime
{
public static $timeModifier = NULL;
public function __construct($now = 'now', DateTimeZone $timezone = NULL)
{
parent::__construct($now);
if($timezone !== NULL) {
$this->setTimezone($timezone);
}
if(self::$timeModifier !== NULL) {
$this->modify(self::$timeModifier);
}
}
}
В начальной загрузке просто установите $ timeModifier
следующим образом:
if(APP_ENV === 'testing') {
My_DateTime::$timeModifier = '-6 months';
}
И затем вы можете использовать его вот так из где угодно:
$now = new My_DateTime();
echo $now->format('Y-m-d H:i:s'); // 2010-01-17 16:41:49
Я никогда не пробовал, но, возможно, libfaketime может помочь здесь: она позволяет "подделать" время для процесса.
Например, смотрите эту статью : Изменение времени, которое считает процесс, с помощью libfaketime
Но, как сказано в этом тикете PHPUnit's Trac, это, вероятно, нужно делать, используя собственный эквивалент функций даты...
Что означает, как вы догадались, что лучшим решением, если вы можете себе это позволить, будет использование вашей собственной функции my_date()
везде.