B/S中客户端与服务器时间不一致的问题(服务器比客户端时间满了几秒)

本人开发中遇到一个问题如下:

request headers

POST /user/login HTTP/1.1
Host: www.linhongzhao.com
Connection: keep-alive
Content-Length: 194
Pragma: no-cache
Cache-Control: no-cache
Origin: http://www.linhongzhao.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
Req-Date: Sat, 28 Apr 2018 02:56:41 GMT
X-Requested-With: XMLHttpRequest
Referer: http://www.linhongzhao.com/user/login.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: __51cke__=; __tins__19303629=%7B%22sid%22%3A%201524823028203%2C%20%22vd%22%3A%205%2C%20%22expires%22%3A%201524824903430%7D; __tins__19194848=%7B%22sid%22%3A%201524823028222%2C%20%22vd%22%3A%205%2C%20%22expires%22%3A%201524824903440%7D; __51laig__=10

response headers

HTTP/1.1 408 Request Timeout
Server: nginx/1.13.12
Date: Sat, 28 Apr 2018 02:56:39 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

注意到response中的Date比request中的req-date还要晚两秒,首先使用的是GMT时间且相差只有几秒,因此排除时区问题,那么只能是服务器时间与客户端时间不一致了。这时候必须要校准时间否则对数据安全、网络安全和客户端业务等方面都是不利的。

那么如何校准呢?

一、从服务器请求

1. 客户端首次运行时,获取并存储服务器时间,然后每次请求服务器之前,用第一次获取的服务器时刻加上从获取服务器时间到现在为止的时长作为Req-Date

2. 每次请求之前都首先从服务器获取服务器时间

二、客户端时间交给用户自己解决,我们只管保证服务器时间正确

考虑到三点

1. 客户端时间我们不一定有权限控制

2. 若时间不准确,用户很多时候都无法正常使用网络服务

3. 现在windows系统都提供自动网络校准服务,可以认为一般客户端时间都是准确的

综上可以不关心客户端时间准确与否,只需保证服务器时间正确即可

服务器时间可以通过下述方法校准

1. 将系统时间同步为硬件时间

clock命令时硬件时间,date命令是系统时间,通过clock && date发现时间严重不一致

[root@linhz-centos-5 dmc]# clock && date # 第一行是硬件时间,第二行是系统时间
2018年04月28日 星期六 11时08分22秒  -0.880125 seconds
2018年 04月 28日 星期六 11:08:20 CST

执行命令hwclock --hctosys

# hwclock --hctosys

再次执行clock && date发现时间一致了

[root@linhz-centos-5 dmc]# clock && date
2018年04月28日 星期六 11时08分41秒  -0.817614 seconds
2018年 04月 28日 星期六 11:08:41 CST

存在问题:一般硬件时间是出厂写入的,不会有很大偏差,但依然存在错误的可能,以及与网络时间不一致的可能

所以这时候就有了方法二

2. 先同步服务器网络时间为系统时间,再将系统时间同步为硬件时间

先下载工具

yum -y install ntp ntpdate

网络时间同步为系统时间

ntpdate cn.pool.ntp.org

系统时间同步为硬件时间

hwclock --systohc

你可能感兴趣的:(linux,php)