我的Drupal 7站点中有一个拥有数千个字段,一堆内容类型,超过25个视图以及数百个(很快成千上万个)配置文件类型。因此,我正在使用一个更好地缓存实体字段信息的核心补丁(http://drupal.org/node/1040790),以及-dev版本的Views,它可以通过显示更好地缓存视图(而不是一个HUGE)视图缓存中包含所有视图数据的行)。
这已帮助站点上的大多数页面加载了20-30MB的已用RAM,而不是160MB +(不是为10MB +的字段和视图拉出cache_ *表行,这些补丁有助于使cache_ *数据保持更高的效率)。
但是,这带来了一个问题,即缓存重建需要很长时间。通常超过一两分钟。在这段时间内,Drupal根本不会加载任何页面(因为它尚未尝试读取的缓存尚未建立,因此其他请求必须等待)。
在低流量周期中,这没什么大不了的。一百个左右的用户只需等待一分钟,即可加载页面。但是在高流量周期中,Apache服务器开始发疯,CPU负载超过40,并且由于所有工作线程都处于等待状态并最大程度地占用了内存,从而导致交换,内存很快就装满了。这有点像死亡螺旋。重新启动httpd可以清除问题,但是恢复正常需要5到10分钟。
我的目标是做到这一点,以使缓存清除不会使站点瘫痪。首先,如果我使用admin_menu的单个缓存清除功能(例如“ CSS和JS”,然后是“菜单”,然后是“主题注册表”,等等),事情进展顺利,直到我点击了“ Page and else”选项。那是在重置视图的缓存时(一个非常占用CPU和数据库的操作,需要缓存视图的数量),并且在重置字段信息缓存时(在此站点上也是CPU和数据库的消耗)。
所以...我的问题/想法:
- 使用drush和/或其他shell脚本,是否有可能比“一次清理所有缓存并希望进行干净的重建”更加智能地清除缓存?
- 我可以在清除缓存时阻止HTTP请求,以使apache不会被一堆带有缓存标记的请求所阻塞吗?
- 如果我可以清除Drupal /正常httpd请求之外的缓存,则可以为缓存清除操作设置更高的PHP memory_limit,并退出我的通用memory_limit(现在设置为256MB,以防任何单个httpd线程需要清除缓存) ...)。
基本上:除了单击UI中的按钮或使用之外,是否有任何智能,优雅的方式使用Drupal清除所有缓存drush cc all
?
[ 编辑说明:我的主要问题是缓存重建,这(a)需要一段时间,并且(b)阻止所有其他请求,直到重建完成。我想找到一种方法来使它在高流量时不会那么致命。]