php性能优化

总体介绍:

一、规范说明

性能是网站运行是否良好的关键因素, 网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是我们每个开发人员必备的素质,也是我们良好的职业素养。

二、影响性能的因素
  • 商业需求
    1. 需求合理性
    2. 需求与系统的整合
    3. 需求所带来的商业利益是否与需求开发的成本成正比
    4. 需求所带来的风险
  • Web 服务器
    1. 并发处理能力
    2. 高负载的能力
    3. 负载均衡的能力
    4. 动态内容与静态内容的处理能力
    5. Web 服务器部署
  • DataBase 服务器
    1. 并发访问
    2. 数据库服务器的部署
    3. 数据库的 shema 架构与的表设计是否合理
    4. 数据检索
  • 操作系统
  • 客户端请求
  • 程序/语言
三、分析性能的指标
  • 程序的运行时间 microtime()
  • 程序的运行所消耗的内存memory_get_usage()
  • 单位时间内的并行处理
  • 磁盘 IO 的处理
四、优化性能的目标
  • 快速、并发、资源消耗低(内存、磁盘 IO、CPU 负载)
五、优化性能的原则
  • 服务器配配置最优化
  • 服务器部署合理化
  • 商业需求合理并与产出的商业价值成正比
  • 架构可用、可维护、可扩展
  • 程序的正确性、简单性、逻辑的合理性。
  • 不断的分析性能的的瓶颈
  • 不断的重构已有的代码
  • 优化的优先级:program->database->web sersver->os->client

代码优化:

1, 连接字符使用 , 代替 . ·echo ‘string1’,$a,’string2’,$b;·
2, 循环之前先取出最大值,而不是在循环里面取值

$max = count($array);
for ($i = 0; $i < $max; $i++) 
{
    echo $i;
}

3, 使用 static 静态方法比普通方法快4倍,static表示的属性只初始化一次 DataInterface::getUserIds($uid);
4, 在PHP中的执行速率从快到慢为:echo(), print(), print_r(),echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
5, 使用unset释放给定的变量
6, includes 和requires 包含文件使用完整路径
7, 使用strncasecmp, strpbrk 和 stripos 代替 regex
8, 使用switch代替if else语句
9, 抑制错误符@性能很低,报错函数
10, 任何时间记住关闭不需要的数据库连接
11, $row['id'] 比 $row[id] 性能快7倍
12, 增加一个全局变量比增加一个局部变量慢2倍
13, 使用单引号而不是双引号引用字符
14, 使用HTML比PHP脚本快2-20倍
15, 使用PHP缓存可加速性能25%-100%
16, $++比++$i慢
17, 不要过度使用OOP,适度而止
18, 尽量使用PHP内置函数

变量

1, 变量长度小,注意变量大小是节约内存的最有效手段,对于来自用户表单、数据库和文件缓存的数据都需要控制变量的大小。 因为cpu要处理的数据是来源于内存,名字越长查询所需要的时间就越多
2, unset()函数注销不需要的变量是一种良好的习惯,将一些不需要的变量立即注销可提高内存的使用率。
3, 尽量不要复制变量,否则就会带来1倍的内存消耗,即使复制变量也应该要立即注销原有变量。
4, 变量类型,初始化变量请注意其变量类型,一个变量在执行过程中最好只有一种类型状态。对于数组变量,请初始化声明,如下: $a = array();
5, 临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销,特别是在一些过程式代码的执行流程中,对于一些函数,如果业务非常复杂,同样需要立即注销临时变量
6, 静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可考虑使用静态变量,减少程序的cpu执行次数
7, 变量的性能:局部变量>全局变量>类属性>未定义的变量。

循环

1, 尽量减少循环的次数。
2, 尽量减少循环的潜逃的层次,不要超过三层。
3, 避免在循环内有过多的业务逻辑。
4, 不要循环包含文件
5, 不要循环执行数据库操作。
6, 优先使用foreach,它比for/while效率高
7, 不要把 count/strlen/sizeof 放到 for 循环的条件语句中
$count=count($array);for($i=0;$i<$count;$i++){};
8, for($i=$total;$i>0;$i--){};性能好于for($i=0;$i<$total;$i--){};
9, 保持循环体内的业务逻辑清晰

函数

1, 函数职责清晰,一个函数只干一件事,不要杂揉过多的业务逻辑
2, 函数代码体不要超过20行,反之,考虑拆分。
3, 优先使用php内置函数,内置函数的参数获取,通过zend_parse_parameters方法来实现,对于数组、字符串等参数,zend实现的是浅拷贝,因此这个效率是很高的。可以这样说,对于php内置函数,其效率和相应c函数几乎相同,唯一多了一次转发调用。
4, 常量与函数同时能干一件事,优先使用常量。

phpversion() < PHP_VERSION
get_class() < __CLASS__
is_null() < NULL ===

6, $_SERVER["REQUEST_TIME"] 替换 time();
7, 字符串替换strtr()->str_replace()->preg_replace()->epreg();
8, 发挥trim最大功效,替换substr。$filepath=trim($filename,’/’).’/’;
9, isset/empty 虽然两个函数功能有所差异,但在同样的情况下推荐使用 empty()
10, isfile/file_exist 两个函数的功能有所不同,file_exist既可判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐使用is_file
11, php中的伪函数
isset empty unset eval
通过上面的介绍可以看出,伪函数由于被直接翻译成指令来执行,和普通函数相比少了一次函数调用所带来的开销,因此性能会更好一些。
mt_rand平均速度比 libc 提供的 rand() 快四倍。

文件

1, 减少文件包含数,减少磁盘 IO
2, 使用完整路径,或者容易转换的相对路径。避免在 include_path 查找
3, 文件的代码行数不要超过 2000 行
4, Require_once/include_once 效率低于 require/include, 需要额外的去查看系统是否已经调用过这个文件. 因为它们在一个 opcode 缓存下的调用非常慢
5, 程序执行文件用 requie/require_once,缓存文件用include/include_once。Include 效率好于 require
6, 优化 spl 中的文件自动加载机制,可参靠 yii
7, 类库文件加载,是否考虑类是否已经实例化,可考虑采用设计模式之单例模式
8, 文件读写的并发性

面向对象

1, 控制实例的创建的数量
2, 优先使用常量、类常量
3, 优先例用静态变量,静态属性
4, 类的结构合理
5, 面象接口编程
6, 封装变化点
7, 依赖于抽象,不依赖于细节
8, 优先使用静态成员
9, 类的接口清晰稳定,类的职责单一,类与类的通信合理
10, 使用常量的好处 编译时解析,没有额外开销 杂凑表更小,所以内部查找更快 类常量仅存在于特定「命名空间」, 所以杂凑名更短, 代码更干净,使除错更方便

运算

1, 用 i+=1 代替i=i+1。符合c/c++的习惯,效率还高
4, if/else与_&&,单条语句判断请选择&&的形式, &&的效率高于if/else,如下 :

if ($a == 1)
{
    $b = 2;
}可选择为($a == 1) && $b = 2;

缓存

1, 使用php加速器,缓冲opcode
2, 例用memcache/nosql
3, 使用内存数据库、
4, 使用文件缓存
5, 缓冲功能

其它

  • 资源优化
    1, 少用@符号,严重影响性能
    2, 适时关闭远程资源连接如数据库,ftp、socket等,适时的清理这些资源
  • 数据库优化
    1, 合理的商业需情
    2, 数据库 schema 架构优化
    3, 垂直与水平分库分表
    4, 索引优化,查询优化
    5, 第三方开源检索工具(sphinx)
    6, 主从数据库服务器的使用。
  • Web 服器优化
  • 操作系统优化
  • 前端优化
    1、合理的 html 结构
    2、合理 html 与css 的同时,考虑 Css 设计合理,减少 http 请求
    3、合理 html 与java script 的同时,考虑拆分是否合理,减少 http 请求
    4、优化 java script 代码,让用户有良好的体验
    5、根据 http 协议,优化高并发请求
  • 其他可以处理的
    1, 一个功能可以用内置函数完成,尽量使用它而不是自己编写php函数。
    2, 如果某个功能对性能要求很高,可以考虑用扩展来实现。
    3, Php函数调用开销较大,因此不要过分封装。有些功能,如果需要调用的次数很多本身又只用1、2行代码就行实现的,建议就不要封装调用了。
    4, 不要过分迷恋各种设计模式,如上一条描述,过分的封装会带来性能的下降。需要考虑两者的权衡。Php有自己的特点,切不可东施效颦,过分效仿java的模式。
    5, 函数不宜嵌套过深,递归使用要谨慎。
    6, 伪函数性能很高,同等功能实现下优先考虑。比如用isset代替array_key_exists
    7, 函数返回引用没有太大意义,也起不到实际作用,建议不予考虑。
    8, 类成员方法效率不比普通函数低,因此不用担心性能损耗。建议多考虑静态方法,可读性及安全性都更好。
    9, 如不是特殊需要,参数传递都建议使用传值而不是传引用。当然,如果参数是很大的数组且需要修改时可以考虑引用传递。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注...
    红鱼绿鱼与驴阅读 1,062评论 0 3
  • 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row['id'...
    红鱼绿鱼与驴阅读 178评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 1 PHP语言级性能优化:少些代码,多用PHP自身能力;(多用PHP内置变量,常量,函数) PHP内置函数的性能不...
    Hank桁阅读 160评论 0 0
  • 因公司项目要求 最近在写H5项目 遇到了关于分页加载list列表的问题 网上差了一些资料 经过自己整理 完美的实现...
    哈酒拎壶冲阅读 509评论 0 0