在工作中遇见了一个问题,最后通过快速学习php语法解决。
问题是客户在访问服务器的网页时 需要从 服务器A 跳转到服务器B,但是B的登录报错。报错内容是 “ 服务器A 和服务器B 时间不同步”。
但是在A和B上分别检查时间和NTP配置,发现是同步的。此时troubleshooting比较困难。
于是思考是否有可能A和B的时间都没有 问题,但是在获取时间传递时间的时候出现了问题。
由于这个web 是用php写的,不涉及编译和混淆,可以很容易的通过网络往回找到具体是哪一个php文件来实现该部分功能。也可以通过服务器上Apache的log来找报错,具体确定是哪一个PHP文件 。
[client ***.***.***.***] PHP Notice: import_r equest_variables(): No prefix specified - possible security hazard in /opt/ /start.php on line 4, referer: https:
$delta = time() - $server_A_time();
if ( ($delta < (0 - $timeout)) || ($delta > $timeout) ) {
$_SESSION['status'] = "Error time not sync";
}
发现是在脚本中进行的比较,那如果我能在脚本中多加几行,把time()和server_A_time() 都打出来,就可以知道是本地时间取错了,还是从serverA的时间拿错了。于是在该php里加入下面几行,将 两个时间,以及做差值后的delta 输出到指定的文件里,这样我重新尝试登陆,再去查看我指定的myfile 就可以 了。
$myfile = fopen("myfile.txt", "w") or die("Unable to open file!");
fwrite($myfile, $delta);
fwrite($myfile,time());
fwrite($myfile,$server_A_time());
$txt = "thanks\n";
fwrite($myfile, $txt);
这样在我的lab里的结果如下。
delta -2754
serverB time 1479429890
serverA time 1479432644
thanks
客户的运行结果如下
delta 1479699729
serverB time 1479699729
serverA time
thanks
于是发现是由于在serverB上拿到的serverA的时间为空导致的。
回到serverA上检查发现,serverA传过去的是带有正确时间的。
• @2016-11-15 20:40:38,278 |getSessionParamValue PHP Array: a:7:{s:8:“username”;:“password”;s:7:“timeout”;s:4:“1800”;s:3:“key”;s:10:"1479213638";
于是问题应该发生在serverB 去连serverA 拿参数的地方,重启ServerB的web 服务器,问题解决。