PHP - 设置/模拟假日期

tup*_*tus 6 php date

我有点奇怪的问题.是否可以在脚本工作的时间在PHP中设置假日期?我正在使用使用时间段的API,例如当您发送获取某些数据的请求时,您可以指定时间段(例如一个月,但这些时间段是固定的),并且它会将request_time-1month的结果返回到request_time.显然,请求数据是当前时间,因此我想模拟当前时间(例如设置日期从5月10日到4月15日).可能吗?我在PHP文档中看不到任何有用的东西,我甚至不知道它是否可行,因为我不确定这个API是否使用来自服务器的工作时间或存储上述数据的独立服务器.但也许有人有任何想法.

谢谢你提前.

Ale*_*tch 14

使用libfaketime(https://github.com/wolfcw/libfaketime).在ubuntu上 - 只需使用apt-get或aptitude安装faketime.

  1. 如果你想假装控制台应用程序的时间:

    LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 FAKETIME="2008-01-01 00:00:00" php yourscript.php
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你想伪造apache时间,你需要在预加载libfaketime的情况下启动apache.刚刚放

    export FAKETIME="2008-01-01 00:00:00"
    export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
    
    Run Code Online (Sandbox Code Playgroud)

进入/ 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
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。我必须将“LD_PRELOAD”设置为“/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1”。当执行“curl -D - http://localhost”时,我得到了一个带有假时间的答案,但是当我在浏览器中打开页面时,日期没有改变。您知道可能出现什么问题吗? (2认同)

IMS*_*SoP 2

如果您要连接的 API 使用“request_time - 1 个月”,那么您的脚本认为的时间并不重要,只与API 背后的脚本认为的时间相关。(打个愚蠢的比喻:如果一家商店下午 5 点关门,提早设置手表不会让你在 5:30 进入;你需要偷偷溜进去并更改墙上的时钟,这样工作人员就不会上锁向上。)

因此,除非您能找到一种方法来欺骗远程 API,使其认为您在不同时间发送了请求,否则您无能为力。

如果您控制 API,那么只需编辑 API 以获得一个覆盖“现在”定义的参数,也许只允许在特殊的调试模式下使用。