Я взял какой-то устаревший код, который использует date()
повсюду. 31-го числа каждого месяца (если применимо) в скрипте есть ошибка, которую я должен быть в состоянии исправить, чтобы исправить. Чтобы сделать это, мне нужен сценарий, чтобы подумать, что сегодня он 31-й.
Очевидно, я мог бы разобрать дату и дать ей строку с желаемой датой, но это должно было бы быть при каждом экземпляре date()
— что было бы очень трудно изменить, и я мог легко пропустить один.
Таким образом, есть ли в верхней части сценария средство для указания, что такое «сегодняшняя дата»? Или делает date()
получать дату с сервера каждый раз, делая это невозможным?
редактировать
Для пояснения этот сценарий размещен в службах приложений Azure, что означает, что, к сожалению, я не могу изменить время системы.
Существует устаревшее расширение pecl, которое называется APD которая обеспечивает функцию override_function()
который делает именно то, что вы хотите. Не проверял, но, вероятно, больше не будет работать.
Другой подход — это так называемое исправление обезьян, использующее пространства имен phps. Увидеть http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html например и объяснение.
namespace myNameSpace;
function date($format, $timestamp = '') {
echo 'Would have returned "' . \date($format, $timestamp) . '"';
}
echo date('d.m.Y', time());
Как мы находимся в пространстве имен \ myNameSpace PHP сначала будет искать \ MyNameSpace \ дата () и использовать это вместо \Дата().
Может быть, вы должны попытаться переопределить date
в целях тестирования? Конечно, сам PHP не допустит этого, но вы можете использовать runkit
«s runkit_function_redefine ():
runkit_function_redefine('date','', 'return "XX-YY-ZZZZ";');
Просто отметьте, что:
По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или
модифицирована. Чтобы переопределить внутренние функции, вы должны включить
Настройка runkit.internal_override в php.ini.
Изменение системного времени обычно ограничено root-level
Счета. PHP
будет работать под идентификатором пользователя веб-сервера, который НЕ ДОЛЖЕН БЫТЬ root. Вам придется использовать sudo
позволить веб-серверу работать с повышенными правами для этой цели. Видеть это
Предполагая, что сервер работает на Windows, я думаю, вы могли бы сделать exec('date 11/24/2013')
, Если это сервер на основе Linux, я думаю, вы можете сделать что-то вроде этого: exec('date -s "24 NOV 2013 12:38:00"').
Командная строка: пример команды Linux Set Date
Используйте следующий синтаксис для установки новых данных и времени:
date --set="STRING"
Например, установите новые данные на 2 октября 2006 г. 18:00:00, введите в качестве пользователя root следующую команду:
# date -s "2 OCT 2006 18:00:00"
ИЛИ вы также можете упростить форматирование, используя следующий синтаксис:
# date +%Y%m%d -s "20081128"