2010-07-17 80 views
7

是否有可能让PHP应用程序认为服务器的日期时间被大量可配置的数量所偏移(如6个月前或6个月后)?在PHP中模拟不同的服务器日期时间

背景: 我们有一个处理体育赛事的网络应用程序,现在我们希望在我们的开发环境中运行它,网站认为它是2009年秋季,而不是2010年夏季。这是因为我们拥有去年秋季的大量数据,今年的赛季还没有开始,所以测试新功能将会更加容易实现大量实际数据,而不是为2010年制作新的测试数据。

我们不希望实际上改变服务器的日期和时间。当前最好的选择似乎是将代码中的所有date()调用更改为my_date(),然后让my_date()将偏移量添加到实际的系统日期。

似乎这个特性对其他人来说类似的情况很有用,所以我只是好奇,是否有一种更简单的方法可以通过一些配置参数在全局范围内完成而不需要修改代码。我做了RTM。

+0

感谢大家的回答。如果我有名誉,我可以给你们每个人一个+1,因为所有的答案都有这样或那样的帮助。 – royappa 2010-07-19 02:43:14

回答

2

您可以在开发服务器上安装Runkit并重新定义所有必需的dateTime函数以返回一个修改后的值,例如

if(APP_ENV === 'testing') { 
    include 'datetime-monkeypatches.php'; 
} 

其中datetime-monkeypatches.php将包含所需功能的补丁。这样你就不必改变你的实际代码。这就像使用适配器到原始功能一样,只要您将它们保存在单独的文件中,它就能保持可维护。

另一种选择是使用http://antecedent.github.io/patchwork

碎料是一个PHP库,使得可以在运行时重新定义用户定义的功能和方法,松散地复制功能runkit_function_redefine纯PHP 5.3代码,其中,除其他外,您可以使用测试双打替换静态和私有方法。

+0

这可能对我们有用,将进行调查。谢谢! – royappa 2010-07-19 02:41:18

2

我从来没有尝试过,但也许libfaketime可以帮助,在这里:它允许人们“伪造”一个过程的时间。

例如,看到这篇文章:Changing what time a process thinks it is with libfaketime


但是,正如this ticket of PHPUnit's Trac说,这可能是什么,应该使用自己的日期,功能相当于做...

这意味着,像你猜,最好的解决方案,如果你能负担得起,确实是在各地使用你自己的功能。

+0

不幸的是,这是在一个托管服务器上,所以我们没有root权限。虽然很有趣! – royappa 2010-07-19 02:42:29

+0

一个使用PHP的内置服务器的例子: 'faketime'2016-04-01 12:00'php -S localhost:8013' – Trendfischer 2016-07-26 10:59:29

2

您可以使用自定义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 
+0

不幸的是,我们在一堆地方使用本地的date()调用。 – royappa 2010-07-19 02:40:14

+1

@royappa好,是的。您将不得不更换所有本地电话。就像使用自定义my_date函数时一样。 – Gordon 2010-07-19 06:25:12

+0

是的,理解。谢谢。 – royappa 2010-07-26 03:43:07

相关问题