这两天对rzchina.net进行网站迁移,将其下载到本地时,发现除首页外,打开其它页面都剧慢无比。有时刚开始可以打开,后来就一个页面都打不开了。打不开时,浏览器状态显示一直在请求,但页面是白的,什么都没有,但标题会显示在浏览器的标题栏中。由于是租用的虚拟主机,因此虚拟主机技术人员认为,是由于Drupal的节点内容存放表node_revision所致,因为在服务器监控记录中查到,这个表被频繁访问,直到把所有资源耗尽。 此外,Drupal的session表和几个cache表也纷纷几十MB,还有session表达到100多MB。整个数据库一个700多MB,十分庞大。Drupal的session表用于存放用户登录信息和所使用的session数据等,如果不及时清除,日积月累就会奕的非常大。运行cron.php可以解决此问题,同时也应该对settings.php进行设置,使每个用户的session保存时间尽可能的短。 ini_set('session.cookie_lifetime', 0); //关闭浏览器,用户就logout- O: t& ?- w2 [0 G. K& c
ini_set('session.gc_maxlifetime', 86400); //24小时 分析node_revision表时,我发现这个表存放了两个非常占资源的数据:body和teaser。不知为什么,那个teaser几乎和body一样长度。teaser本是用于显示摘要的,但由于我们的网站不是以blog为主,而是以列表为主,因此很少用到teaser,这样teaser的数据就浪费了大量的空间,因此我选择了将其设为空值,一下子把原来140多MB的表缩小到了70多MB,几乎是一半。目前还未发现不良症状。 但是,问题还是存在。打开一个页面后,还是一样除首页外,其它均无法正常打开。使用Firebug监测究竟是哪个文件下载有问题,发现是什么/language/zh-hans这样一个路径始终在请求,还以为是语言包的问题。但在node里把zh-hans的节点改成和首页一样的en,还是没有解决问题。 最后,我还是想到了Drupal最核心的东西——模块。如果把CMS比作Drupal的灵魂,把节点比作Drupal的血肉,那模块就是骨骼了(如果还继续比的话,主题就是外衣)。现在灵魂没改、血肉基本都在数据表时,外衣更是没人动了,可就是什么都没有,”无法移动”,肯定就是“骨骼”的问题了。 最开始我认为是我的自定义模块有问题,便逐一去除,发现问题依旧。不过现在我才从另一个角度体会到Drupal模块式架构的精妙之处了。就算你把本来运行的模块直接从文件夹里移除,程序还会运行的好好的(当然前提是你是按照Drupal的方式来开发模块增加功能的)。然后我就逐一去除第三方模块。CCK和Views这种肯定不会有什么问题,这时,我发现了一个模块——Poormancron。 这个模块有点特殊,它是为了那些无法配置能够定期运行cron.php的管理员而准备的。它的原理很简单,每个页面在访问时都会激活poormancron的功能,看看是不是到时间运行cron.php了。如果到了就去运行,如果没到就不运行。因此有人称其为“懒人模块”。在rzchina.net中,有个功能是定期收集其它博客的内容,使用的是cron机制。那么每次poormancron 检查到期时,就会进行大量的数据处理工作。到此问题的原因逐渐清晰了:
poormancron被第一次激活运行后,开始往node_revision表里插入大量的数据。而可能是由于配置不正确的原因,每访问一下页面,就会被poormancron认为该执行cron.php了。于是不停的插入数据,造成了node_revision表一直被占用,直到服务器资源被耗尽。不过至于为什么poormancron失灵,而以前却是可用的呢?目前原因还在调查中,尚不明朗。不过,我以后不打算用这个模块了。
我认为,对于不能配置服务器自动执行cron.php的条件下,还是按排人定期手动执行即可。即使不知道cron.php的路径,如果过期,后台管理界面也会提示的。此外,很多问题都是在执行cron.php时出现的,因此还是有人监控的时候执行比较好。
摘自:方医生798,谢谢!
. F. @5 f2 P( Z" U
|