2010-07-17 82 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

相關問題