TypeCodes

再议wordpress中限制没有Gravatar头像的访客提交评论

今天博客收到@羽中童鞋关于文章《wordpress中限制没有Gravatar头像的访客提交评论》的评论,对代码中使用 get_headers 函数的效率提出质疑。于是写这篇文章来讨论一下。

wordpress中限制没有Gravatar头像的访客提交评论

博客目前的主题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 »