PHP CURL获取服务器时间并计算与本地的时间差

在各类抢购场景下,精准的服务器会给我们带来非常多的方便。减少因为网络问题和时差问题带来的“慢别人一步”。

废话不多说,直接上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
header("Content-type: text/html; charset=utf-8");
date_default_timezone_set("Asia/Shanghai");
 
// 记录本机当前毫秒级时间戳
$localTime = microtime(true);
// 启动一个curl会话
$curl = curl_init();
// 设置抓取的网站
curl_setopt($curl, CURLOPT_URL, "www.w8o.net");
// 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_TIMEOUT, 8);
// 设置获取响应头
curl_setopt($curl, CURLOPT_HEADER, true); 
// 设置获取的信息以文件流的形式返回
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// 执行curl
$result = curl_exec($curl);
// 返回curl执行信息
$curlStartTransferTime = curl_getinfo($curl,CURLINFO_STARTTRANSFER_TIME);
// 关闭curl会话
curl_close($curl);
// 通过服务器响应头获取服务器秒级时间
$pregResult = preg_match("/Date: ([0-9a-zA-z\:\,\s]*)\n/s",$result,$serverHeader);
$serverTime = strtotime($serverHeader[1]);
// 计算本地与服务器时间差距
$differenceTime = $localTime + $curlStartTransferTime - $serverTime;
 
echo "本地时间与服务器时间差距:".$differenceTime."s.\r\n";
echo "从建立连接到响应需要:".$curlStartTransferTime."s.\r\n";

在现实案例中很多抢购页面为了防止抗不住流量,采用静态页面的方式存储。例如某个卖手机的某视商城。

我们也可以定时curl采集页面,并通过CURLINFO_FILETIME常量来获取服务器文件最后修改时间,已确定页面是否更改,当然这个常量针对php等动态页面是无效的。另外服务器文件最后修改时间也可以通过JS来获取,执行document.lastModified;即可。

注:因为服务器响应头并不直接返回毫秒级时间,以上程式仅仅能秒级上更加精准,并非完全完全精准。