高性能lamp程序设计 付超群

35
LAMP 人 人人人人人人人 LAMP 人人人人人人人人 www.LAMPER.cn QQ 人3330312 http://weibo.com/lampercn

Upload: shaoning-pan

Post on 15-Jan-2015

1.592 views

Category:

Technology


4 download

DESCRIPTION

高性能Lamp程序设计 付超群

TRANSCRIPT

Page 1: 高性能Lamp程序设计   付超群

LAMP 人 主题分享交流会

LAMP 人主题分享交流会

www.LAMPER.cnQQ 群: 3330312

http://weibo.com/lampercn

Page 2: 高性能Lamp程序设计   付超群

高性能 LAMP 程序设计

超群 .com@fuchaoqun

http://www.fuchaoqun.com

Page 3: 高性能Lamp程序设计   付超群

PHP 篇

Page 4: 高性能Lamp程序设计   付超群

Performance…

不要用 array_key_exists ,用 isset 来判断键值是否在数组中

如有可能,采用 static 静态方法

避免使用 __set, __get 等魔术方法

使用 echo 代替 print()

使用 include 、 require 代替 include_once 、 require_once

@ 操作符是邪恶的

不要把 count/strlen/sizeof 放到 for 循环的条件语句中

……

Page 5: 高性能Lamp程序设计   付超群

不好意思,今天不讲这些…

Page 6: 高性能Lamp程序设计   付超群

Why?http://www.garfieldtech.com/blog/magic-benchmarks

循环 200W 次

原生获取: 0. 31μs/ 每次

__get : 1μs/ 每次

原生设置: 0.38μs/ 每次

__set : 1.3μs/ 每次

说实在的,我不 care 这些… .

Page 7: 高性能Lamp程序设计   付超群

But…

代码洁癖,程序中最好不要有错误,哪怕是 notice

干净的代码,非必要不引入

SQL 语句不要放在 for 循环里面执行,最好能用 group by 之类解决,或者合并写入

出了问题再 profile 你的 PHP 代码

通过 auto loading 实现 lazy loading

相比较运行速度,更需要注意 memory limit ,尤其是一些 shell 处理脚本

Page 8: 高性能Lamp程序设计   付超群

Profiling

PHP 工具:

Xdebug 、 xhprof ,或者

整体性能工具

ab -n 10000 -c 200 http://127.0.0.1/test.php

Page 9: 高性能Lamp程序设计   付超群

OpCode

Try : APC 、 eAccelerator….

Page 10: 高性能Lamp程序设计   付超群

PHP Framework

http://doophp.com/benchmark

Page 11: 高性能Lamp程序设计   付超群

PHP Tunning Case : ColaPHP

ColaPHP 完成一个完整的调度( Frontcontoller 、 Router 、 Dispacther 、 Controller 、 Responser ),消耗

0.5ms

使用 Xdebug 跟踪代码运行效率,使用 webgrind 展示

大部分的消耗在文件引用上 (include/require) ,虽然用了 opcode 加速,>0.3ms

大量使用 __set 、 __get 等魔术方法来实现对象的按需生成

通过 spl_autoload_register 实现类的 lazy loading ,大大提高框架速度

“ 短”代码

框架流程可随时被终止,只需为用到的特性买单

Page 12: 高性能Lamp程序设计   付超群

Webserver 篇

Page 13: 高性能Lamp程序设计   付超群

Apache VS Nginx

http://blog.a2o.si/2009/06/24/apache-mod_php-compared-to-nginx-php-fpm/

Page 14: 高性能Lamp程序设计   付超群

Nginx 502

http://blog.s135.com/post/361/

Page 15: 高性能Lamp程序设计   付超群

数据库篇

Page 16: 高性能Lamp程序设计   付超群

MySQL

Linux server & MySQL server tunning

短、小

动静分离

分库分表

良好的索引 & Explain

主从同步,通过从库来扩展读

尽量 Cache ,减少 SQL 操作

批量操作 & 队列

讹传比性能更可怕,比如: left join 都很慢、 like 用不到索引、 char

一定比 varchar 好 ,,,,

Page 17: 高性能Lamp程序设计   付超群

NoSQL : MongoDB

Page 18: 高性能Lamp程序设计   付超群
Page 19: 高性能Lamp程序设计   付超群

架构篇

Page 20: 高性能Lamp程序设计   付超群

几个原则抗住,然后再优化

过渡设计比不设计更龌龊

越简单越好

如非必要,不要引入

层次清晰

可随时替换

可水平扩展

良好的监控预警

Page 21: 高性能Lamp程序设计   付超群

动态应用通用结构

Page 22: 高性能Lamp程序设计   付超群

Cache

Browser Cache

Last modify 、 Etag 、 Expires

Page Cache

Squid 、 Varnish 、 Nginx proxy_cache 、 Nginx fast_cgi_cache

Data Cache

Memcached 、 Redis

Page 23: 高性能Lamp程序设计   付超群

Nginx fast_cgi_cache

fastcgi_temp_path /data/ngx_fcgi_tmp;

fastcgi_cache_path /data/ngx_fcgi_cache levels=1:2

keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;

fastcgi_cache_valid 200 301 302 1d;

fastcgi_cache_use_stale error timeout invalid_header http_500;

fastcgi_cache_key http://$host$request_uri;

Page 24: 高性能Lamp程序设计   付超群

Data Cache

Mostly Memcached , some tips :

http://tech.idv2.com/2008/08/17/memcached-pdf/

Memcached pool

How to batch update some related data?

How to sync cache over IDC?

Page 25: 高性能Lamp程序设计   付超群

常用组件篇

Page 26: 高性能Lamp程序设计   付超群

消息队列用处:

异步处理耗时操作,比如发邮件、发微博等

开源项目:

memcacheq : http://memcachedb.org/memcacheq/

beanstalkd : http://kr.github.com/beanstalkd/

RabbitMQ : http://www.rabbitmq.com/

Page 27: 高性能Lamp程序设计   付超群

分布式任务处理: Gearman

Page 28: 高性能Lamp程序设计   付超群

全文检索开源项目sphinx 、 xapian 、 lucence

中文分词:scws : http://www.ftphp.com/scws/

集成方案:coreseek : http://www.coreseek.com/

Page 29: 高性能Lamp程序设计   付超群

前端篇

Page 30: 高性能Lamp程序设计   付超群

PHP is rarely the bottleneck, 80-90% front-end.

--Rasmus Lerdorf

Page 31: 高性能Lamp程序设计   付超群

无连接Browser Cache ( Expires )

CSS Sprite

Lazy loading

图片、头像等

合并请求

避免重定向

Page 32: 高性能Lamp程序设计   付超群

没流量JS 、 CSS压缩

Gzip

图片压缩

Browser Cache ( Last modify 、 Etag )

Lazy loading

使用 ajax 减少流量

<img src="" /> is evil

Page 33: 高性能Lamp程序设计   付超群

其他CDN

静态文件使用无 cookie域名

CSS 放顶部, JS 放底部(通常情况下)

Page 34: 高性能Lamp程序设计   付超群

工具Page Speed

Yslow

使用 Javascript记录页面渲染时间

Page 35: 高性能Lamp程序设计   付超群

Thanks & QA