如何强制PHP/Apache再使用一年


How to force PHP/Apache to use another year?

所以,另一名员工递给我一个旧项目。它的编码很糟糕,差点让我辞职。两次因为我没有那么多时间(这项任务给了我两周的时间),我无法重写整个内容。我按照要求修改了它,目前,我正在做测试。问题是,代码应该在其他年份改变它的行为。这个问题的问题是,没有设置当前年份的中心位置,所有的代码都使用date("Y"),这将迫使我更改大约200个文件。

因此,最简单的解决方案是在开始时告诉PHP:"嘿,现在是20xx年"。我试过date_default_timezone_set(),但这对我没有任何帮助。所以我要找的是:

  • 将当前年份更改为设置值的PHP命令(如Set_Date("Y", 2016);
  • 更改当前时间的Apache Server命令(如setdate -Y 2016

有没有办法或者至少有一个变通办法让剧本认为又是一年了?

您可以使用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");

这可能不适合您的情况,但我认为我应该分享这种滥用名称空间的情况:

<?php
namespace FakeTime;
function date($format, $time=null){
    return 2001;
}
var_dump(date('Y'));

这是其他用户建议和如何使用libfaktime的组合。无需PECL扩展。

修改/etc/apache2/envvars可以很容易地伪造时间只需添加:

export FAKETIME="2015-12-04 12:41:15"
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1

确保LD_PRELOAD指向git源。现在重新启动你的电脑2,你会及时回到你问这个问题的时候!

Frist按照建议编译libfaktimehttps://github.com/wolfcw/libfaketime

将烘焙的libfaketime动态加载到需要的脚本中

if (!extension_loaded('libfaketime')) {
    dl('libfaketime.so');
}

可选:

使用auto_prepend_file配置为每个文件预先发送dl(..命令。

其他可能的方法是简单地编译第二个PHP安装并修改日期函数:https://github.com/php/php-src/blob/master/ext/date/php_date.c