drupal7很慢如何优化打开速度

钩子回调是为了让Drupal获得最大的灵活性和开发的便利性,这一点对性能的损耗是肯定的。但同时 Drupal 有很多其它如缓存、异步调用等手段来弥补性能的损耗甚至是增强性能,从而使 Drupal 在扩展性、灵活性与性能方面取得非常好的平衡。
1.drupal 匿名用户访问时,才是整个页面缓存,用户登录时是页面部分缓存.
2.drupal 缓存有多种形式,默认为数据库缓存
3.每个页面初次访问会花点时间生成缓存,再次访问就直接取缓存数据了.
4.打开css和js以及页面的压缩,减少页面大小和请求次数.
因为drupal在运行cron的时候,特别是建立search索引,放数据库中写数据的量是惊人的。如果每写一条mysql都往硬盘里写一下做了什么,然后再处理下一个请求。自然会很慢,频繁i/o会让机器负载高。而且你从top上看不出来。
很多人刚接触Drupal的时候,总是感觉Drupal很慢,即便是在本地,装了几个Drupal模块以后,感觉就跑不动了。这个本身和本地环境的配置也有关系,建议修改php.ini文件,将PHP的内存,执行时间都调的大一点。这样就不会感觉慢了。
可以在php.ini里面将memory_limit设置的大一点,我通常设置为512M,默认好像是32M,还是64M。
可以装个APC,XCACHE这样的OPCODE缓存,这个对于Drupal的性能提升是最明显的。
模块不要装太多,尤其是安装量比较小的Drupal模块,更应该注意。模块太多,对于性能的拖累也是非常明显的。
网站上线后,建议开启所有的缓存。
性能优化的关键就在于缓存。drupal有各种层次的缓存技术。 
Drupal6比Drupal5慢, Drupal7比Drupal6慢,Drupal8比Drupal7慢。其中,Drupal7的性能问题最为突出,性能比Drupal6慢很多。
Entity API模块用的时候,要小心,很吃内存,也存在潜在的性能问题。顺便说一句,Commerce比Ubercart慢,具体慢多少,没有实际测试过,这是应该的,Commerce大量的使用Entity API,对性能影响很大,性能问题一直也是让commerce头疼的问题。
个人心得:
匿名用户全部采用缓存,注册用户采用区块缓存,固定的几个链接写在一个区块中调用,模块升级检测设置为一个星期检查一次;这些设置完成后基本能满足大部分人的需要了。

Memcache的重要性不用多说,wordlink">drupal由于模块较多,数据库调用频繁,因此memcache是wordlink">drupal站点中必备的配置,大概列一下Drupal7中关于memcache的配置情况。

1. 安装memcache服务以及启动memcached。
2. 安装drupal的memcache模块。(http://drupal.org/project/memcache)
3. 配置settings.php

$conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';
 // The 'cache_form' bin must be assigned no non-volatile storage.
 $conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
 $conf['cache_default_class'] = 'MemCacheDrupal';
 $conf['memcache_key_prefix'] = 'something_unique';

memcache_key_prefix 这个配置是 memcache 所使用的前缀,就是如果多个 Drupal 网站使用同一个 Memcached 的话,可以分别去设置不同的前缀。这样可以区分一下。

注意,需要将memcache.inc的文件路径写正确,如Drupal模块目录组织方式总结中提到,我们一般将memcache模块会放置在contrib文件夹下面,因此路径可能是 sites/all/modules/contrib/memcache/memcache.inc。
此外memcache_key_prefix最好设置一下。

4. 多个memcachd服务。
默认情况下,如果不配置memcache_servers以及memcache_bins的话,Drupal会认为只有一个server,即127.0.0.1:11211,如果有多个memcache实例的话,需要添加如下配置。

$conf['memcache_servers'] = array(
  '10.1.1.1:11211' => 'default',
  '10.1.1.1:11212' => 'default',
  '10.1.1.2:11211' => 'default',
  '10.1.1.3:11211' => 'cluster2',
  '10.1.1.4:11211' => 'cluster2'
);
$conf['memcache_bins'] = array(
  'cache'  => 'default',
  'cache_filter' => 'cluster2',
  'cache_menu' => 'cluster2'
);


dashan 答复于

Boost模块的功能,用来为Drupal生成静态的HTML页面,可以极大地提高效率.它自身带有一个爬虫,用来判断过期的页面,并重新生成静态页面.能够支持Apache, Nginx等主流web服务器,效率高于Varnish.
Apache需要启用mod_rewrite ,
另外需要启用简洁URL

装好后,他有提示怎么设置:
1:Administer > Site configuration > Clean URLs 启用简洁url。
2:在性能设置菜单Administer > Site configuration > Performance > Boost settings 进行设置
3:改写.htaccess 文件,有例子参考
4:改写robots.txt,添加
     # Files
     Disallow: /boost_stats.php
     Disallow: /CHANGELOG.txt
5:Administer > Site configuration > Performance 启动drupal的cache缓存机制。
6:检查状态报告:admin/reports/status 。确保boost通过。
OK了,换个匿名用户访问,你就看到在第二步设置的目录下生成了htm文件。

dashan 答复于

Drupal在大量logged user并发情况下的瓶颈,在于执行Drupal代码的CPU时间,而不是在于数据库或者其他地方。之所以出现这样的情况,和PHP本身的执行机制和 Drupal的实现方式有关。Drupal在生成一个非cached的页面时,不管这个页面多么简单,都要执行一个完整的bootstrap过程,即使只启用了最少的模块,这个过程也要调用几十个PHP文件,执行成千上万行PHP代码。而PHP的机制又决定了没有任何PHP代码或者对象能够驻留内存,每次响应请求都必须执行完整的初始化工作。而anonymous user之所以快,是因为Drupal在执行cached page的时候,不会执行完整的bootstrap过程,它先检查是否cached page,是的话就读取缓存,然后结束工作。这样当然就快了。

 1. 为什么Drupal的性能在各种环境下相差并不多。无论是双服务器,单服务器,甚至内存非常小的虚拟机,logged user的RPS值往往总是在10~20之间。数据库里面有几百条,或者几十万条记录,影响也不大。因为瓶颈并不在于DB或者内存,而是在于执行代码的过程。
    2. 为什么使用APC/XCache这样的代码优化程序,能够得到极大的性能提升。在我自己的虚拟机环境上,RPS从3~4提升到了12。因为它提升的是PHP代码的执行时间。 
        从这个结论出发,列出一些对优化Drupal的logged user性能有明显作用和没有明显作用的措施:
I. 没有明显作用的:
    1. 加内存。在并发数只有10+的时候,即使每个请求占20M内存,也只有200M+内存而已。
    2. DB server和Web server分开,或者增强DB server的配置。一台中等性能的mysql服务器,应付200~300的并发是很轻松的事情,在并发数只有10+的时候,db server实际上是很空闲的。
    3. 基础软件的优化,例如从Windows转移到Linux,从apache转移到Lighttpd,从MySQL迁移到其他数据库,除了从Windows转移到 Linux会有比较明显的提升以外(因为PHP在Linux上的效率比在Windows上要好),其它的措施可能会快一些,但不会有大幅度的提高,因为瓶颈不在那里。
II. 有明显作用的:
    1. 使用APC/XCache这样的代码优化程序,速度会有几倍的提升。估计大家都已经这样做过了。
    2. 增加web server的CPU数量。双核的肯定比单核的快,4个CPU肯定比2个CPU快得多。
    3. 使用多web server+单db server的配置,把代码执行的压力分散到不同的web server上。上文说到,单台db server可以轻松应付200+的并发,这意味着理论上可以支持10台以上的web server。
    4. 使用Quercus这样的引擎,把PHP代码编译成Java,再在Java VM中运行,理论上会有很大的提高。原因是,第一,Java的运行效率比PHP高,第二,Java代码是可以cache的,不需要每次都重新加载。Drupal在Quercus下有4倍的性能提高,但是这个数字跟Drupal在打开APC/eAccelerator下的提升差不多,所以可能没有太大的实用价值。 
dashan 答复于

       使用cache API基本上是没有意义的,因为对于logger user,Drupal不会调用cache API。Drupal.org上有人提出,即使是logged user,有很多页面也是不用定制化的,这意味着可以cache它们。但是Drupal没有提供这样一种机制。只要是logged user,Drupal就会执行完整的bootstrap过程,即使只打印出一个hello world,因此实际上你没有办法在logged user状态下cache单个页面。
        到目前最新版本的Drupal(Drupal 6.4)为止,对于logger user,Drupal只提供了一种cache功能,就是可以将部分block设置为可cache的。在block占用大量服务器时间的情况下,block cache能够有效地提高效率。但是,由于block cache对于bootstrap过程并无影响,因此当瓶颈在于bootstrap本身时,Block cache是无能为力的。
        在Drupal.org的社区,关于logger user的cache问题,一直处于热烈的讨论之中。基本的结论是,由于Drupal的架构就是这样,目前没有很好的解决方案,只能期待Drupal在以后的版本中进行改进了。
        我研究了一下Drupal的bootstrap过程,发现也许这样是可行的:实现hook_boot函数,这是bootstrap中执行最靠前的一个函数,它被调用时,bootstrap的大部分过程还没有执行。在hook_boot中,检查当前页面是否需要cache,如果是,直接读 cache生成页面,然后调用exit()强行结束。这在理论上是可行的,但太过hack了一点。
Drupal的情况是这样,那么其他的PHP框架,尤其是半官方的Zend Framework,性能如何呢?通过搜索,我在网上找到了一份PHP framework comparison benchmarks,网址见:http://www.avnetlabs.com/php/php-framework-comparison-benchmarks。根据这份报告的数据,Zend Framework的性能只有原生PHP的10%,如果没有用APC,连3%都不到。当然,这份报告的数据不一定详尽,Zend Framework在不同环境下的表现应该也会有出入。但是,Zend Framework的性能大幅度落后于Baseline PHP,应该是确凿无疑的。
        为什么PHP主流框架的性能都存在着这样的问题呢?其实这也不难理解。回顾PHP沉思录系列第一篇中对于PHP工作模型的讨论,由于PHP没有驻留内存的进程,所以每一个request发生时,都必须初始化所有的对象,这导致大量的时间被耗费在进程代码的执行过程中。当PHP程序仅仅是简单的脚本时,这无关紧要,但是在结构复杂的架构中,由于每次处理request都要重复调用成千上万行代码,这一问题就变得非常突出了。而且,除非PHP以后的版本对这一机制进行改进,否则这个问题无法得到彻底的解决。
        那么,这是否意味着,PHP只能适用于小型的网站,而无法在高并发量的大型网站施展拳脚呢?当然不是这样。事实上,在Yahoo和其他许多知名的巨型网站上,都大量地使用了PHP。原因在于,PHP仅仅被用作一个内容生成器,生成的内容会被转化为静态文本,绝大多数用户浏览的都是被cache的静态文本。这就和PHP程序的性能毫无关系了。但是,当用户并不是仅仅进行浏览,而是需要频繁地和网站进行互动时,PHP的性能不但无法比拟C和Java,甚至无法与同为脚本语言的Python和Ruby相比。也就是说,PHP更适合于新闻门户这样的内容发布站点,而不是web 2.0应用的首选。
        在本系列文章告一段落的时候,我们看到的是PHP的局限性。热爱PHP的人们可能会对此觉得沮丧。但是,这并无损于PHP作为一门优秀语言的声誉。尺有所短,寸有所长,对于我们熟悉和喜爱的工具,我们更应该了解它们的局限,这也有利于我们更有效地使用它们。 
dashan 答复于

http://www.drupalcoder.com/blog/improve-drupals-performance-by-not-execu...

这是一篇非常强大的文章。

原理是这样的:默认的条件下,drupal会加载所有的region和在region中的block;无论这个region是否被你在template(tpl.php)中删除,只要你在info文件中声明了,他就会加载这个region中所有的blocks.这会相当杀性能。

作者想办法绕开了这个问题。

dashan 答复于