今天博客收到@羽中童鞋关于文章《wordpress中限制没有Gravatar头像的访客提交评论》的评论,对代码中使用 get_headers 函数的效率提出质疑。于是写这篇文章来讨论一下。
博客目前的主题vfhky已经启用了这段代码,来限制没有gravatar头像的访客进行留言。在访客提交留言时,程序会自动检测是否有gravatar头像,经过这么长时间的测试感觉返回的判断结果还是比较快的。当然,这可能跟博客同一时间的请求量不大也有关系。
当然还可以使用其它方式来判断,之前文章《再议Gravatar头像缓存至本地服务器》做法是:先远程请求资源,然后把gravatar头像保存到本地服务器,再根据图片的filesize($e) == 2637
判断没有gravatar头像。
但这样做消耗的资源比较大,所以考虑可以采用curl的方式。其优势在于能够通过DNS缓存来加快响应速度,另外可以直接通过CURLINFO_HTTP_CODE返回值来判断。
下面是具体代码,同时也用这段代码替换了博客之前用的代码,并提交到了github上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | /*
* @author:vfhky 2014年03月15日22:26
* @param string $email 用户提交留言表单中的email字段
* @return int 0:无gravatar头像; 1:有gravatar头像
**/
function vfhky_checkgravatar($email){
$email_hash = md5(strtolower(trim($email)));
$check_uri = 'http://www.gravatar.com/avatar/' . $email_hash . '?d=404';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $check_uri);
/* 保留response header */
curl_setopt($ch, CURLOPT_HEADER, TRUE);
/* 去掉response body */
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$result = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200')
return 1;/* 有头像 */
else
return 0;/* 无头像 */
}
|
Comments »