Моделируйте другой сервер datetimes в PHP

Действительно ли возможно подать заявку PHP, думают, что дата и время сервера смещается большой настраиваемой суммой (как 6 месяцев назад, или 6 месяцев с этого времени)?

Фон: у Нас есть веб-приложение, которое имеет дело со спортивными мероприятиями, и прямо сейчас мы хотели бы выполнить его в нашей среде разработки таким способом, которым веб-сайт думает, что это - Осень 2009 года вместо Лета 2010 года. Поэтому у нас есть большие данные с прошлогоднего Осеннего сезона, и сезон этого года еще не запустился, так тестирование новых возможностей было бы легче со ставридами реальных данных вместо того, чтобы составить новые данные тестирования на 2010.

Мы не хотим на самом деле изменять дату и время сервера. Текущий наилучший вариант, кажется, для изменения всей даты (), вызовы в коде к my_date () и затем иметь my_date () добавляют смещение к фактической системной дате.

Казалось, что эта функция будет полезна в аналогичных ситуациях для других, таким образом, мне было просто любопытно, существует ли более легкий способ сделать это глобально через некоторый параметр конфигурации, не изменяя код. Я сделал RTM.

8
задан Funk Forty Niner 5 May 2017 в 19:23
поделиться

3 ответа

Вы можете установить 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, который, помимо прочего, позволяет заменять статические и частные методы тестовыми двойниками.

2
ответ дан 5 December 2019 в 22:16
поделиться

Вы можете использовать собственный класс 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
2
ответ дан 5 December 2019 в 22:16
поделиться

Я никогда не пробовал, но, возможно, libfaketime может помочь здесь: она позволяет "подделать" время для процесса.

Например, смотрите эту статью : Изменение времени, которое считает процесс, с помощью libfaketime


Но, как сказано в этом тикете PHPUnit's Trac, это, вероятно, нужно делать, используя собственный эквивалент функций даты...

Что означает, как вы догадались, что лучшим решением, если вы можете себе это позволить, будет использование вашей собственной функции my_date() везде.

2
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: