我有一个有点奇怪的问题。是否可以在 PHP 中设置脚本运行时间的假日期?我使用的API使用时间段,例如当您发送请求获取一些数据时,您可以指定时间段(例如一个月,但这些时间段是固定的),它会返回从request_time-1month到request_time的结果。显然,请求数据是当前时间,所以我想模拟当前时间(例如设置日期从5月10日到4月15日)。是否可以?我在 PHP 文档中看不到任何有用的信息,我什至不知道它是否有效,因为我不确定这个 API 是否使用它工作的服务器或存储上述数据的独立服务器的时间。但也许有人有任何想法。
提前致谢。
使用 libfaketime (https://github.com/wolfcw/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 时间,你需要在启动 apache 时预加载 libfaketime。就放
export FAKETIME="2008-01-01 00:00:00"
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
into /etc/apache2/envvars
并重新启动阿帕奇。现在你的服务器响应总是看起来像
$ 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
2019 更新:
在最新的系统上,您需要 64 位版本的 libfaketime,因此您需要LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1
(感谢@jtrautmann),或者甚至libfaketimeMT.so.1
在多线程环境中。
此外,还有三种方法可以指定伪造的时间:
- 通过设置环境变量
FAKETIME
- 通过使用环境变量中给出的文件
FAKETIME_TIMESTAMP_FILE
- 通过使用该文件
.faketimerc
在你的主目录中
- 通过使用该文件
/etc/faketimerc
对于系统范围的默认值
此外,在 docker 容器内使用 libfaketime 是完全有效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)