IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    失去的地平线发表于 2017-03-07 13:47:02
    love 0

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

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

    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;即可。

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



沪ICP备19023445号-2号
友情链接