我有点奇怪的问题。是否可以在脚本工作的时间在PHP中设置假日期?我正在使用使用时间段的API,例如当您发送获取某些数据的请求时,您可以指定时间段(例如一个月,但这些时间段是固定的),并且它会将request_time-1month的结果返回到request_time。显然,请求数据是当前时间,因此我想模拟当前时间(例如设置日期从5月10日到4月15日)。可能吗?我在PHP文档中看不到任何有用的东西,我甚至不知道它是否可行,因为我不确定这个API是否使用来自服务器的工作时间或存储上述数据的独立服务器。但也许有人有任何想法。
先谢谢。
答案 0 :(得分:14)
使用libfaketime(https://github.com/wolfcw/libfaketime)。在ubuntu上 - 只需使用apt-get或aptitude安装faketime。
如果您想假装控制台应用的时间:
LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 FAKETIME="2008-01-01 00:00:00" php yourscript.php
如果你想伪造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
答案 1 :(得分:2)
如果您要连接的API使用“request_time - 1个月”,那么您的脚本认为时间是不相关的,只有 API后面的脚本的时间认为是。 (作为一个愚蠢的比喻:如果一家商店在下午5点关闭,提早设置你的手表将不会让你在5:30;你需要潜入并更换墙上的时钟,以便工作人员不会锁定向上。)
因此,除非您能找到一种方法来欺骗远程API以为您在不同时间发送请求,否则您无能为力。
如果您控制API,那么只需编辑API以获得一个超越“now”定义的参数,也许只允许在特殊调试模式下使用。
答案 2 :(得分:1)
实际上,您通过PHP访问的日期和时间是服务器的系统时间。因此,如果您能够改变它,您就可以实现您的需求。看看这个答案:https://stackoverflow.com/a/3923946/977431
虽然就个人而言,我建议只使用从当前日期返回-30天(例如)的函数。如果您想更改日期,请将该函数替换为真实的getdate()
。
答案 3 :(得分: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);
}
答案 4 :(得分:0)
这对我有用:
apt-get install faketime
faketime '2021-04-26 08:15:42' php cron.php