xjpvictor's Blog
小老鼠,上灯台,两只耳朵竖起来

解决爬虫导致php session文件过多


各种折腾·phpscript

本文发表于超过180天以前,部分内容可能已经失效

最近查看一个自己写的网站的时候,发现用来存放session文件的目录里面有超多的文件,居然rm ./*的时候还报错说文件太多了 -_-|||

仔细想想应该是爬虫导致的,因为这个网站虽然并没有太多的访客,来的爬虫倒是不少。每个爬虫访问一次,就会产生一个session file。单纯靠php的gc是不够了。只好想想怎么区分真正的访客和爬虫了。

一般访客访问的时候,应该是有页面的滚动动作,或者鼠标键盘的动作,所以可以靠这个来区分。

页面上加上一段javascript代码

<script>
function notRobot() {
  document.cookie = "_notRobot_=1;path=/";
  window.removeEventListener("scroll", notRobot);
  window.removeEventListener("mousemove", notRobot);
  window.removeEventListener("keypress", notRobot);
}
window.addEventListener("scroll", notRobot);
window.addEventListener("mousemove", notRobot);
window.addEventListener("keypress", notRobot);
</script>

所以当访客翻页/移动动鼠标/按下键盘的时候,就会设置一个cookie,以便和爬虫区分开。

再修改服务器端的php代码,根据这个cookie来判断是否需要session_destroy()

if (session_status() === PHP_SESSION_ACTIVE && (!isset($_SESSION['robot']) || $_SESSION['robot'] !== 0)) {
  if (isset($_COOKIE['_notRobot_']) && $_COOKIE['_notRobot_'] == 1)
    $_SESSION['robot'] = 0;
  else {
    session_destroy();
  }   
}

当然这么做也有缺点

首先是当一个访客第一次访问时,他在页面上做的所有动作都不会被记录,因为会被session_destroy()

第二个缺点是session文件会被建立再删除。当然也可以先判断$_COOKIE['_notRobot_'],通过了才session_start()

然而第二个缺点也同时是优点,因为这样做可以把session_destroy()放在末尾执行,对主体代码的影响比较小,所以如果主体代码依赖$_SESSION变量的话会不需要进行任何改动。

此外这样做可以在第一次访问确认访客不是爬虫后,在第二次访问时把信息写入$_SESSION,之后就不再需要通过_notRobot_的cookie判断,于是可以让_notRobot_的cookie过期,从而节省之后访问时的http头部开销。当然,服务器需要在判断访客不是爬虫时不再输出之前的javascript,以避免再次设置_notRobot_的cookie。

本文 "解决爬虫导致php session文件过多" 由 K. Huang 首先发表于 xjpvictor's Blog 并以 CC BY-NC 4.0 许可证发布 © 2016
转载注明引用来源 https://blog.xjpvictor.info/2016/03/too-many-php-session-file-by-crawlers/

赞助我

评论

你的邮箱地址不会被公开。必填项以 * 标出

无意义或不相关评论将被删除

取消 上传图片 或拖拽上传

* Some files will not be uploaded. Only png, gif, jpg are allowed and maximum 10 images, each file less than 10M.

你可以添加 10 个 png/gif/jpg 图片 (每个文件小于 10M)

允许使用以下html标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

你可以上传文件,粘贴代码或长文至 Drop.it.r

更多相似文章