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

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

命令行下运行PHP

之前写过一篇《PHP实现程序值守》,在实际应用中,特别是自有服务器或者是本地执行中,还是非常不方便的,特别是对于线程的控制。
在cmd下运行php可以妥善解决上类问题。

w8o.php部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 设置编码
header("Content-type: text/html; charset=utf-8");
// 设置时区
date_default_timezone_set("Asia/Shanghai");
// 设置脚本执行时间
set_time_limit(0);
 
// 死循环执行程序
do{
 // 获取参数
 echo var_dump($argv);
 // 输出
 flush();
 // 请求间隔时间
 sleep(10);
}while(true);

然后使用cmd运行,以本机安装的xammp为例子运行执行

1
2
3
4
d:
cd xampp
cd php
php.exe -f D:\xampp\htdocs\w8o.php 100

即可实现可视化的程序值守,且多线程执行上也比直接采用浏览器来运行更加方便。

几个需要注意的地方:

一、CMD下执行php是不能直接获取$_GET参数的,我们需要采用$argv来获取,仅需要在需要执行的页面后加空格直接传递参数的值即可,参数允许多个,并会以数组的方式返回。

二、一般我们写php均采用UTF-8编码,而在cmd下执行输出时会产生乱码,可以在CMD下执行chcp 65001,即可切换到UTF-8编码。

三、关于中文输出,在UTF-8编码下,我实验过网上的各种方法,其实都存在缺陷,并不完美,建议大家在输出的时候还是采用英文输出比较好。或者你有完美的解决方案,也可以给我留言。

 

超轻量PHP框架 – Fat-Free Framework

很久没写PHP了,可能快有1年多。我竟然很奇葩的想在函数的参数上申明参数类型。也不知道是跟哪个语言的串了。

写过几个ThinkPHP的系统,感觉写一些小的东西的时候,ThinkPHP还是不是很合适,太过复杂,自定义的空间也比较小。百度后找到了个国外的超轻量框架Fat-Free Framework。百度谷歌了很久,基本没找到,关于Fat-Free Framework的中文手册。

通过开发群里的朋友才知道,国内应该只有一个叫“棒主妇商城”的开源系统采用了Fat-Free Framework框架,我下载研究了下,即使这个商城也只是局部使用了Fat-Free Framework,而且用的是3.0版本的Fat-Free Framework。而现行Fat-Free Framework的最新版本是3.5,基本没有太多的参考性。

Fat-Free Framework是一个足够轻量的框架,其压缩后只有60K,解压后Lib在330K,相对ThinkPHP几兆的框架文件,在小型项目的开发中有着天然的优势。

因我自己对Fat-Free Framework也还没研究的很透彻,具体的编程上的就不再做介绍,建议大家可以看Fat-Free Framework官方网站的用户指南和API参考。