在各类抢购场景下,精准的服务器会给我们带来非常多的方便。减少因为网络问题和时差问题带来的“慢别人一步”。
废话不多说,直接上代码。
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;即可。
注:因为服务器响应头并不直接返回毫秒级时间,以上程式仅仅能秒级上更加精准,并非完全完全精准。