如何强制PHP/Apache使用另一年份?

5
我收到了一份由另一位员工编写的旧项目,它的代码质量很糟糕,差点让我辞职。鉴于时间不多(我只有两周的时间完成这项任务),我没办法对整个项目进行重写。我按要求进行了修改,目前正在进行测试。问题是,代码需要在其他年份改变其行为。而这个问题的问题在于,没有一个中央位置来设置当前年份,而是分散在代码中使用date("Y"),这将强制我更改大约200个文件。
因此,最简单的解决方案是在一开始告诉PHP:"嘿,现在是20xx年"。我尝试过date_default_timezone_set(),但它对我没有任何帮助。所以我正在寻找:
  • 一种PHP命令,可以将当前年份更改为设置的值(例如:Set_Date("Y", 2016);
  • 一种Apache服务器命令,可以更改当前时间(例如:setdate -Y 2016
是否有任何方法或至少是变通方法可以使脚本认为它是另一年?

3
你只需要进行测试,是吗?你不能暂时更改操作系统时间吗? - Flosculus
@Flosculus 这台服务器上还有其他开发人员和运行工具,更改时间可能会影响他们的工作或破坏某些东西。此外,还有一些 cron 作业正在运行,因此更改整个系统时间可能是所有解决方案中最后一个。 - Realitätsverlust
嗯,我可能有一个解决方案...不过有点hacky。你有一个使用时间依赖的所有PHP函数列表吗? - Flosculus
2
不行,因为这会改变与库(例如php)链接的任何内容的时间。你也不能使用奇怪的时区(我们曾经用于y2k测试),因为你仍然需要修改所有代码来进行测试。启动一个虚拟机应该需要大约30分钟(假设你还没有镜像)。这看起来比任何其他解决方案都要简单得多。 - symcbean
1
你可以编译第二个PHP安装包,并修改date()函数以返回一个虚假的日期。 - Daniel W.
显示剩余4条评论
4个回答

3
你可以使用 runkit_function_redefine() 重新定义函数,但你需要安装 runkit PECL 扩展注意: 我没有测试过!
<?php 
print date("Y");

$date = 'print "Hello, it is a new definition of date function <" . $Y . ">"; return 2014; ';
runkit_function_redefine('date', '$Y', $date);

date("Y");

这应该可以运行 - 并结合自动前置和浏览器端的 cookie,不需要对现有代码进行任何更改,并且无法与其他工作并行运行。 - symcbean
没错,这个没有问题。非常感谢! - Realitätsverlust

2
这是其他用户建议和我如何使用libfaketime的结合。无需PECL扩展。您可以通过修改/etc/apache2/envvars来非常容易地伪造时间,只需添加:
export FAKETIME="2015-12-04 12:41:15"
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1

确保LD_PRELOAD指向Git源代码。现在重新启动apache2,你就会回到当时你提出这个问题的时间点!


这基本上是Hrym的评论和DanFromGermany的回答,不是吗;-) - Álvaro González
既然你这么说,确实看起来是这样。我并不是有意这么做的。我只是发布了我使用的内容 :/ 我应该删除我的帖子吗? - cb0
我认为,如果您编辑答案并澄清您正在解释如何配置其他问题中建议的库,那么就应该没问题了。 - Álvaro González

2

也许这并不适用于您的情况,但我认为我应该分享一下命名空间的滥用:

<?php

namespace FakeTime;

function date($format, $time=null){
    return 2001;
}

var_dump(date('Y'));

3
那真是美丽而可怕。不幸的是,从他的绝望情况来看,他正在使用“php < 5.3”。 - Flosculus

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接