2013-05-10 48 views
4

我有點奇怪的問題。在腳本工作的時候,是否可以在PHP中設置假日期?我正在使用使用時間段的API,例如,當您發送請求獲取某些數據時,您可以指定時間段(例如一個月,但這些時間段是固定的),它會將request_time-1month的結果返回給request_time。顯然,請求數據是現在的時間,所以我想模擬當前的時間(例如設置日期從5月10日到4月15日)。可能嗎?我無法看到任何有用的PHP文檔,我甚至不知道它是否會起作用,因爲我不確定這個API是使用它從中工作的服務器還是使用存儲上述數據的獨立服務器的時間。但也許有人有任何想法。PHP - 設置/模擬假日期

預先感謝。

回答

1

如果要連接到使用「REQUEST_TIME - 1個月」的API,那麼什麼腳本認爲時間是不相關的,只是什麼時間的API後面的腳本認爲它是。 (一個愚蠢的比喻:如果一家商店在下午5點關門,提早設置您的手錶不會讓您在5點半進入;您需要潛入並更換牆上的時鐘,以便員工不會鎖定了。)

所以,除非你能找到一種方法來欺騙遠程API以爲你在不同時間發送的請求,沒有什麼可以做。

如果你控制的API,然後只需編輯API有一個參數,過度乘坐的「現在」的定義,也許只允許在一個特殊的調試模式。

+1

似乎你是對的。不幸的是,我無法做任何事情,因爲我無法控制API。那麼,我需要找到另一種方式。感謝您的答覆。 – tuptus 2013-05-10 12:02:40

+0

@Rakkun \t在我的比喻中,這仍然只是一種設置自己手錶的方式;它不會對運行API的遠程服務器上的時鐘做任何事情。另外,這應該是一個單獨的答案,而不是對我的評論。 – IMSoP 2013-05-10 14:12:09

0

實際上,您通過PHP訪問的日期和時間是服務器的系統時間。所以如果你能夠改變這一點,你可以實現你所需要的。看看這個答案:https://stackoverflow.com/a/3923946/977431

雖然就個人而言,我只想用它從當前日期返回-30天(例如)函數建議。當您想要更改日期時,請將該功能替換爲實際的getdate()

+0

我用shell_exec和是的,date()返回'我'的日期,但API返回的結果仍然是相同的。似乎我在時間問題上無話可說。不管怎麼說,還是要謝謝你。 – tuptus 2013-05-10 11:56:35

0

你究竟在做什麼?如果你正在測試的東西,你不應該依賴於系統配置在所有 - 更好地做一些事情,如:

my_function(\DateTime $now = null) { 

    if($now === null) { 
     return new \DateTime(); 
    } else { 
     return $now; 
    } 

} 

在你正常的代碼,你只需要調用my_function(),但在您的測試,你叫

如果是爲了生產代碼
$now = \DateTime::createFromFormat(...); 
my_function($now); 

類似的想法。將日期作爲參數傳入,而不是讓函數獲取它。

my_function(\DateTime $datetime) { 
    // does stuff 
} 
call_my_function() { 
    my_function(new \DateTime()); 
} 
other_way_to_call_my_function() { 
    $datetime = \DateTime::createFromFormat(...); 
    my_function($datetime); 
} 
+0

我試圖'欺騙'API,使它成爲「今天不是今天」的事情,但我現在可以看到我無法做任何事情。 – tuptus 2013-05-10 11:59:04

9

使用libfaketime(https://github.com/wolfcw/libfaketime)。在Ubuntu上 - 只需使用apt-get或aptitude安裝假時間。

  1. 如果你想假時間控制檯應用程序:

    LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 FAKETIME="2008-01-01 00:00:00" php yourscript.php 
    
  2. 如果你想假apache的時候,你需要與libfaketime預裝啓動Apache。只要把

    export FAKETIME="2008-01-01 00:00:00" 
    export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 
    

在/ etc/apache2的/ envvars中,並重新啓動Apache。現在你的服務器響應總是看起來像

$ curl -D - http://localhost 
HTTP/1.1 200 OK 
Date: Tue, 01 Jan 2008 00:00:00 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Last-Modified: Tue, 01 Jan 2008 00:00:00 GMT 
ETag: W/"420419-b1-4429c2a6653ac" 
Accept-Ranges: bytes 
Content-Length: 177 
Vary: Accept-Encoding 
Content-Type: text/html