PHP框架结构优化方向词条

来源:互联网 发布:手机远程ubuntu 编辑:程序博客网 时间:2024/06/05 05:24
转载请说明出处,请尊重作者http://blog.sina.com/thinkpc

大家好,首先做个小广告我的的CMS,有空大家捧场,我最近太忙没怎么继续更新:)
过段时间工作稳定后就继续更新,大家多提提意见
这里只是想实现一个万能发布系统,实现后再进行深层次优化:)
地址:http://code.google.com/p/fireideacms/

目前我将之前经历的各种框架发现的特性总结了一下
写下以下心得和大家分享,期望得到大家回馈好有更多的词条加入

各位务必记住不要过渡优化自己的系统,只有碰到性能瓶颈的时候才去针对性优化,否则会导致系统结构很乱,并且无用,一般来说一个系统越复杂,那么维护成本以及风险就会越大。

系统结构分成多层
对系统的分层就是为了避免系统过于复杂,分清系统的各个职能是维护系统简洁和好维护的关键。

Router层(dispatcher层或者java的control层)
业务层:引用各种公共库,对各个模块的API进行组合,以及逻辑处理
模块封装层:包含模块一些封装逻辑的操作,以及对其他模块的API
API层,包括给业务层调用的函数类库,以及其他系统的API封装
数据适配层:数据类操作的ORM以及适配,并提供NOSQL服务,隔离数据库细节以及NOSQL细节

其他一些优化tips

 硬件的性能瓶颈:网卡吞吐可以用多个网卡合并,CPU用多核,内存多加,硬盘用RFID,极限了就集群分组,
 软件性能极限:数据库主从,nginx反向代理,memcache,nosql,LVS,DNS分地域、轮询,SQuid类CDN缓冲,前端SPI。

  用于服务类API,通过URL重写可以缩短URL的长度,比如/url/参数1/参数2/
  不管目录内部文件结构怎么变化,都可以在升级的时候保持API地址不变更
  可以对一些资源重定向,如404错误提示,302跳转,且有助于SEO,防盗链等
 有规律文件拼写URL直接定位资源,如知道用户UID直接拼url获取用户头像:url/uid/size.jpg
  网站设计的时候动态和静态内容URL有明确区分,这样做CDN前端CACHE很方便
 个别浏览器同一个域名并发只有两个下载,如果要优化速度建议考虑下这个,但是域名太多DNS压力会大
 通过DNS解析,可以分流用户压力,但是DNS更新周期很慢,如果一组服务器挂掉会导致一小时才能恢复
 F5路由对压力分流很有帮助具有承受压力很强的特点,但是很贵,他有两种工作模式,直接分流,编程分流
 Apache需要重启下服务才会生效,如果写错了很悲剧,这里可用php的kelin一类重定向,但是并发不怎么好
  需要用正则写规则,如果用的多可能导致规则覆盖,找起来很麻烦
 一次性hash这个算法应用场景好多好多……比如资源定位,信息分布式保存,memcache多服务器保存HA
  只有看rewrite.log才知道当前请求定位到哪里去了,悲催
  建议开启http 304可以减低很多服务器压力
  LVS下apache建议在header头内加服务器name,用于找到那个服务器出问题
  前端CDN可以用Squid一类cache
 不经常更新的内容生成静态页面,不需要搜索引擎记录的东西可用ajax获取或者SPI技术合并
 
 LVS集群下应取消自动TAG缓冲功能,因为不同子服务器Tag不同,改为其他方式更新tag
  服务器间同步建议用Rsync,这个更新很方便
  周期性处理的东西,可以用crontab,但是务必小心,因为集群时谁运行是个问题
  NFS很有用,适合一些共享数据保存,但是要注意IO压力
  SVN的bugziller很好用,对与bug维护很有用

  PHP OPCODE Cache,减少PHP编译时间
  PHP插件类调用越少,IO越少
  PHP实时include越少,工作效能越高
  使用fastcgi,减少php进程加载时间
  apache多进程可以加强PHP并发
  PHP尽量少做Socket通讯类事情
  PHP尽量少做阻塞类工作
  使用nginx的html缓冲可以减少硬盘IO,类似Squid
  使用Nginx反向代理做集群可以加强系统并发
  模块与模块对外的业务逻辑做成API供其他模块调用
 各种API要做性能测试争取在0.05秒以内,API做大数据性能测试,并做性能日志进行监视,定期做单元测试
  不经常更新运算结果保存到内存Cache内,如Redis
  经常更新数据,如计数器放独立内存Cache
  用双写方式保证Cache稳定
  排序一类可以使用Redis去做
  redis多key操作用Mset一类命令
  重要数据要保存LOG,哪怕是文本LOG
  高并发的数据操作要注意并发问题,如文件写入,数据库事务
  消息队列是一个很好的系统之间通讯或任务下发的载体,如短信,邮件,消息通知
 java的消息触发方式的工作方式很节省系统资源,并发很高,个别需求可让java去处理。

算法类收集
  最好所有算法要根据输入数据量进行测试,不同算法数据量不同会有不同的效果
  大数据量处理,统计类建议对统计数据进行分割统计
 处理数据量十分巨大,可以考虑导成文本并任务分割多份,然后投放到Hadoop一类的云框架进行异步处理

Mysql数据库类
  mysql开启慢数据查询log
  myiasm适合经常查询如,查询占使用比例80%以上,更新20%以内
 innodb适合更新,适合事务,务必关闭自动commit选项,可以加快插入,但是内存要大
  索引对会降低数据插入速度
  数据库索引有左前缀顺序问题,使用的时候多用explain评估下
 mysql有查询cache当没有更新的时候索引没有变化的时候同样的sql语句(分大小写)会直接走cache
 mysql主从模式务必在同局域网,否则数据同步很慢,主库可以用innodb做事务,从库用myiasm
  打开binlog以用于恢复数据
  更新过于频繁的表放memcache内
  不经常更新的数据放php内常量或者memcache内
 
redis
  数组排序用redis不错
  做数据关联关系类用redis
  mysql也记得存一份备份
  做集合的交集不错

最后,奉劝大家不要有技术偏见,对于PHP不擅长的,一定要用其他语言取长补短,完善整个系统结构,作为技术保证一个系统的完善高效是我们的责任。