你现在的位置:首页 > PHP网站建设知识库 > Drupal > 正文

谈谈如何做好Drupal性能优化

确定一定以及肯定是的drupal的扩展性确实强大,什么事情都是双刃剑,同时也造成了很多的性能瓶颈,成了PHP网站建设者们最大的难题,在PHP开源系统设计、开发、建设方面,良好的可扩展性和极佳的高性能是很难平衡的问题。

\

drupal平台本身的优劣没有必要讨论,就Drupal的性能问题,下面罗列几条实战经验,仅供参考。

\

1. 使用静态页面缓存(Boost模块)

静态页面是最快的,没有之一!
因此静态页面缓存是最佳选择,尽量把页面动态的部分独立处理,用ajax/iframe调用,整个页面是静态页面,部分用ajax刷新(当然用shtml也可以)。 Boost模块经过稍微调整和修改,可以设置某些Roles(比如一般认证用户)也读取静态缓存(apache/nginx的rewrite),并且可以很好的工作在Apache和Nginx上面,并使某些角色,比如管理员,不读取静态页面。对于一个普通网站,90%以上的都属于普通认证用户和匿名用户,因此,经过这样修改可以大大提高性能。

Ajax建议使用Drupal的高效Ajax Callback模块

这里给出了nginx的boost设置文件,仅供参考。

				###Nginx-BOOST
  set $boost "";
  set $boost_query "_";
 
  if ( $request_method = GET ) {
    set $boost G;
  }
  if ($http_cookie !~ "DRUPAL_ADMIN") {
    set $boost "${boost}D";
  }
  if ($query_string = "") {
    set $boost "${boost}Q";
  }
  if ( -f $document_root/cache/normal/$http_host$request_uri$boost_query$query_string.html ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/normal/$http_host/$request_uri$boost_query$query_string.html break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.css ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.css break;
  }
  if ( -f $document_root/cache/perm/$http_host$request_uri$boost_query$query_string.js ) {
    set $boost "${boost}F";
  }
  if ($boost = GDQF){
    rewrite ^.*$ /cache/perm/$http_host/$request_uri$boost_query$query_string.js break;
  }
  ###END-BOOST

2. opcode
Drupal 需要load相当多的PHP文件,所以opcode是必须的,MUST!
实践证明eAccelerator比APC和xCache好一点,注意:APC的某个版本在NFS环境下有bug,不能正确缓存,所以建议使用eAccelerator。

3. Memcache memcache是LAMP平台居家必备的缓存服务器
最好多个memcache集群使用,Memcache可以使用Drupal的Memcache模块,支持多个集成。

注意:当Memcache不在本机,那么需要占用网络带宽,并且Drupal的缓存数据比较大,比如theme信息,node-type信息等,再每页请求都要加载,这样读取cache的流量就非常大。

比如,每次读取cache 500K,那么1千次访问就需要占用流量500M,这个流量相当不小。建议把这部分不经常修改的cache保存在本机某个cache目录下面,可以把cache目录mount到内存上面,这样会大大提高缓存的效率。

自定义启动和停止的脚本,不必再kill和逐个启动memcache。

				#!/bin/sh 
# 
# Startup script for the server of memcached 
# 
# processname: memcached 
# pidfile: /etc/memcached/memcached.pid 
# logfile: /etc/memcached/memcached_log.txt 
# memcached_home: /etc/memcached 
# chkconfig: 35 21 79 
# description: Start and stop memcached Service 
 
MEMCACHED_HOME=/etc/memcached 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MEMCACHED_HOME/lib 
 
# Source function library 
. /etc/rc.d/init.d/functions 
 
RETVAL=0 
 
prog="memcached" 
basedir=/etc/memcached 
cmd=${basedir}/bin/memcached 
 
# 绑定侦听的IP地址 
ipaddr=`/sbin/ifconfig eth0|sed -n '2p'|awk '{print $2}'|cut -c 6-30` 
 
# 设置memcached启动参数 
port=11210                     # 服务端口基数,使用11210 + i的方式 
threads=4                      # 在服务器上运行memcached进程的最大进程数 
user=`whoami`                  # 运行程序的用户身份 
max_memory=128                 # default: 64M | 最大使用内存 
max_simul_conn=1024            # default: 1024 | 最大同时连接数 
#maxcon=51200 
#growth_factor=1.3             # default: 1.25 | 块大小增长因子 
#thread_num=6                  # default: 4 
#verbose="-vv"                 # 查看详细启动信息 
#bind_protocol=binary          # ascii, binary, or auto (default) 
start() { 
    echo -n $"Starting $prog: " 
    for((i=1;i

4. 使用CDN
要想使页面加载较快,必须使用CDN。(原理请查阅相关文档)
CDN Drupal有两个模块 Parallel 和 CDN,Parallel比较简单,推荐使用。但是Parallel目前已经并入CDN模块,所以还是得要下载CDN模块 

5. 数据库结构合理、分表、分库

首先告诫一点:不要使用content-profile模块
该模块把profile信息存储成一种你node-type,问题是这样会导致node表比较大,但是profile的node除了uid之外其他都是无用信息。加入一个网站有上百万、千万用户,再有很多文章(node),这样node表将会非常大,尤其是一个user有很多profile的node,比如5个,这样node表就会有5倍的user数量的node。导致查询node、user都没法处理,views之类的工具更是没法用,因为views生成的SQL将会非常慢。

把user相关表分出去,到独立的数据库,这样可以方便其他站点,比如子站,共享用户信息。

对于大型网站,不推荐使用太多第三方模块,因为大多模块都是基于node,如果跟node没有关系的独立数据,建议自己写模块来读写,这样方便数据的拆分和优化,又减轻了node表的压力。所以再使用模块前,必须了解模块的工作机制。

6. 服务器

Web服务器建议,推荐使用HAProxy/varnish作为前端代理,Nginx作为Web服务器,php-fpm作为FastCGI处理PHP程序,当然也可以使用Apache作为PHP后端处理,但是不推荐使用apache作为Web节点服务器。

7. 使用Drupal的Pressflow版本

Drupal本身没有太多考虑性能的优化,Pressflow是一个专门针对Drupal的优化版本,包括支持Mysql Master-Slave等等。对于大型网站,选择Pressflow是必须的。

http://pressflow.org/

8. 其他相关模块

 

模块

版本

缓存类型

效率

匿名 / 注册

更新状态

1. Boost 5.x, 6.x 对匿名用户直接调用文件缓存 非常高 匿名用户 6.xyes
5.xno
2. Javascript Aggregator 5.x, 6.x 文件 中等 全部 Yes
3. Cache Router 5.x-beta, 6.x-rc, 7.x-beta 数据库、文件、PHP opcode和内存 根据设置从中等到非常高 根据设置 Yes
4. CDN 6.x, 7.x 服务器 全部 Yes
5. CacheExclude 5.x, 6.x 数据库 中等 匿名用户 Yes
6. CSS Gzip 6.x 文件 中等 全部 Yes
7. Memcache API and Integration 5.x, 6.x 内存 大部分匿名用户 Yes
8. Block Cache 5.x-dev 数据库 中等 全部 Yes
9. Block Cache Alter 6.x 数据库 中等 全部 Yes
10. Term Lower Name 6.x 数据库 中等 全部 更新较少
11. Path Cache 6.x 根据设置 中等 全部 更新较少
12. Advanced Cache 5.x, 6.x-dev 数据库 中等 大部分注册用户 Yes
13. Authcache 6.x-rc 数据库、文件、PHP opcode和内存 根据设置从中等到非常高 全部匿名用户,大多数注册用户 Yes
14. Previous/Next API 6.x-dev 数据库 中等 全部 较少更新
15.fastpath_fscache 4.7.x-dev, 5.x-rc, 6.x-dev 对匿名用户调用文件缓存(避开db) High 匿名用户 Yes
16.Varnish 6.x-dev, 7.x-dev Reverse proxy(虚拟内存) 非常高 全部注册用户,大部分匿名用户 测试阶段
17. High-performance JavaScript callback handler 6.x, 7.x Javascript Callback 中等 全部 Yes
18. Apache solr 6.x-dev, 7.x-dev 全文检索 主要对于搜索页面的提高 Yes

最后一提的是关于性能分析

PHP中debug和性能分析推荐使用xdebug和xhprof,两个模块都可以详细都列出函数执行都步骤以及时间,相比较而言xhprof比较轻量级一下,可以下载drupal的xhprof模块来配合使用,效果更加~