Php及drupal性能优化系列(二)

  • 684 views
Uploaded on

Drupal性能优化,php性能优化、服务器性能优化,Varnish缓存。

Drupal性能优化,php性能优化、服务器性能优化,Varnish缓存。

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
684
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
8
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. by Robbin Zhao (http://www.drupal001.com) PHP和Drupal性能优化系列(二) 赵高欣 (Robbin Zhao) zhaogaoxin@gmail.com http://www.drupal001.comSaturday, 14 July, 12
  • 2. by Robbin Zhao (http://www.drupal001.com) 目录 从网站的用户体验说起 让PHP异步执行 Drupal最佳网站架构模式 Boost的缓存管理和性能问题 Varnish的缓存管理Saturday, 14 July, 12
  • 3. by Robbin Zhao (http://www.drupal001.com) 浏览器处理网页请求分析 URL请求的几个阶段: DNS查询 建立TCP连接 发送HTTP请求 (GET只发送头部) 等待服务器相应 开始接收服务器输出 接收完成 减少上面任⼀一环节的时间,就能提高网页响应时间!Saturday, 14 July, 12
  • 4. by Robbin Zhao (http://www.drupal001.com) 浏览器处理网页请求分析 我们可以优化的: DNS查询 (预解析) 等待服务器相应 (代码的执行时间) 开始接收服务器输出 (减少传输、压缩) 接收完成 FireBug:Saturday, 14 July, 12
  • 5. by Robbin Zhao (http://www.drupal001.com) 让PHP异步执行 浏览器 PHP进程 PHP异步执 输 行可以最快的响 浏览器 出 应用户操作。 PHP进程继续 (和输出无关)Saturday, 14 July, 12
  • 6. by Robbin Zhao (http://www.drupal001.com) PHP异步执行演示 PHP异步执行的使用 1. 开启后台进程 (Linux/Windows后台命令: popen) 2. PHP基于HTTP协议的异步代码 (ignore_user_abort)Saturday, 14 July, 12
  • 7. by Robbin Zhao (http://www.drupal001.com) Drupal最佳网站架构 1. 使用Varnish并做双机热备 2. Varnish之前可以再有LB 3. 对静态内容使用独立域名 4. 用Nginx提供静态内容 5. 动态页面Nginx代理到Apache 5. Apache比FastCGI稳定 6. Memcache是必须的 7. GlusterFS可以做NFSSaturday, 14 July, 12
  • 8. by Robbin Zhao (http://www.drupal001.com) Boost的缓存管理 1. Boost为每⼀一个URL生产⼀一个缓存页面。 包括URL中不同的query,也会生产⼀一份静态缓存,我们需要忽略 ⼀一些对输出没有影响的参数。在boost_init里面添加如下3列: 2. Boost只缓存匿名用户访问? 有些页面,登录用户和匿名用户展示同样的结果。(给所有用户缓存⼀一份) 有些页面,所有的登录用户看到的结果都⼀一样。(给所有登录用户缓存⼀一份) 强制缓存,修改全局变量:$GLOBALS[_boost_should_cached] = TRUE 如果要使用缓存,还得修改.htaccess文件。Saturday, 14 July, 12
  • 9. by Robbin Zhao (http://www.drupal001.com) Boost的缓存管理 3. 缓存文件存在,如何让Boost强制覆盖已有文件,生成最新的缓存 在自定义模块里添加如下代码: 4. 如何修改Boost缓存文件的文件名或者目录 默认情况下,Boost跟URL生成对应的缓存文件,如果要修改文件名,在自定义代 码的任何位置,修改全局变量$GLOBALS[_boost_path]即可。如下示例: hook_preprocess_page(&$vars) { if (vars[node]->type == ‘typeA’) { $GLOBALS[_boost_path] = ‘typeA/’ . $GLOBALS[_boost_path]; } } 注:要使用修改后的boost缓存,必须修改相应的Apache URL Rewrite的设置。Saturday, 14 July, 12
  • 10. by Robbin Zhao (http://www.drupal001.com) Boost的缓存管理 5. 如果Drupal开启JS/CSS压缩,重建缓存时JS/CSS文件名会变。 这时,Boost生成的静态页面缓存会失效,因为JS/CSS引用找不到了。 对于⼀一个大型网站,重新生成所有的静态页面缓存是灾难性的。 修改drupal_get_css和drupal_get_js,如下所示,删掉querystring 6. 如果JS/CSS聚合文件存在,如何让Drupal强制重新生成最新文件 A方案:把生成的js/css和文件名记录到数据库,hook_menu(js|css) B方案:通过ignore_boost_query忽略某⼀一参数,如:flush 然后删除js/css文件来强制重新生成。如drupal_build_css_cache/ drupal_build_js_cache函数中,添加如下:Saturday, 14 July, 12
  • 11. by Robbin Zhao (http://www.drupal001.com) Boost的性能问题 boost_nodeapi的性能问题 由于node的更新、添加等操作都会触发boost的缓存检查操作,这是⼀一个 缓慢的操作!!! node_save的性能问题 node_save会清除缓存,因为清除缓存是⼀一个很耗时的操作,我们参考⼀一下源 码: 因此,在无需清除缓存时使用:$conf[‘node_save_clear_cache’] = FALSE; 同理,我们修改⼀一下boost_nodeapi函数Saturday, 14 July, 12
  • 12. by Robbin Zhao (http://www.drupal001.com) Apache配置小提示 A. Boost的修改会经常需要修改Apache的配置文件,因此 在Apache中如何调试URL Rewrite? 在配置文件中加入断点,然后用firebug或http工具请求URL,打印你想要的变 量。(可以参考http://www.drupal001.com/上详细介绍) RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI} [R=301,L,QSA] B. 提高Apache的性能,AllowOverride需要None 为了使用.htaccess,更好的办法是include在主配置文件中,如下: <Directory /var/www/html/www.zinch.cn/html/> AllowOverride None Include /path/to/your.htaccess </Directory>Saturday, 14 July, 12
  • 13. by Robbin Zhao (http://www.drupal001.com) 缓存!Varnish可以做得更多 a. 为相同的结果设置相同的hash b. 让Drupal输出的HTML结果,也缓存到Varnish。修改vcl_fetch if (req.url ~ "path/" ) { unset beresp.http.Cache-Control; unset beresp.http.Pragma; unset beresp.http.Expires; set beresp.ttl = 10m; set beresp.do_gzip = true; set beresp.http.Cache-Control = "max-age=600"; } c. Varnish缓存管理 varnishadm命令行 ban.url (3.x) telnet Expect set 1 $argv spawn telnet 192.168.1.1 6082 expect "Type quit to close CLI session." send "ban.url $1n" expect "200 0" send "quitn"Saturday, 14 July, 12
  • 14. by Robbin Zhao (http://www.drupal001.com) Thank You ! Robbin Zhao (赵高欣) http://www.drupal001.comSaturday, 14 July, 12