• PHP性能优化


      规范说明

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

      影响性能的因素

      1、商业需求

        需求合理性

        需求与系统的整合

        需求所带来的商业利益与需求开发的成本成正比

        需求所带来的风险

      2、Web服务器

        并发处理能力

        高负载的能力

        负载均衡的能力

        动态内容与静态内容处理能力

        Web服务器部署

      3、Database服务器

        并发访问

        数据库服务器的部署

        数据库的shema架构与表设计是否合理

        数据检索

      4、操作系统

      5、客户端请求

      6、程序/语言

      分析性能的指标

      1、程序的运行时间

      2、程序的运行所消耗的内存

      3、单位时间内的并行处理

      4、磁盘IO的处理

      优化性能的目标

      快速、并发、资源消耗低(内存、磁盘IO,CPU负载)

      优化性能的原则

      1、服务器配置最优化

      2、服务器部署合理化

      3、商业需求合理与产出的商业价值成正比

      4、架构可用、可维护、可扩展

      5、程序的正确性、简单性、逻辑合理性

      6、不断分析性能的瓶颈

      7、不断的重构已有的代码

      8、优化的优先级:program->database->web server->os->client

      程序优化

      1、变量

        a、变量大小,注意变量大小是节约内存的最有效手段,对于来自用户表单、数据库和文件缓存的数据都需要控制变量的大小。因为CPU要处理的数据是来源于内存。

        b、变量有效期,使用unset()函数销毁不需要的变量是一种良好的习惯,将一些不需要的变量立即销毁可提高内存的使用率。

        c、复制变量,尽量不要复制变量,否则就会带来1倍的内存消耗,即使复制变量也应该要立即注销原有变量。

        d、变量类型,初始化变量请注意其变量类型,一个变量在执行过程中最好只有一种类型状态。对于数组变量,请初始化声明,如下:$a = array();

        e、临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销,特别是在一些过程式代码的执行流程中,对于一些函数,如果业务非常复杂,同样需要立即注销临时变量

        f、静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可考虑使用静态变量,减少程序的CPU执行次数

        g、变量的性能:局部变量>全局变量>类属性>未定义的变量

      2、循环

        a、尽量减少循环的次数

        b、尽量减少循环的嵌套层次,不要超过三层

        c、避免在循环内有过多的业务逻辑

        d、不要循环包含文件

        f、不要循环执行数据库操作

        g、优先使用foreach,它比for/while效率高,如果循环内调用函数,用array_walk最好,它的效率要比for高出1倍,要比foreach高出43%的效率

        h、不要把count/strlen/sizeof放到for循环的条件中for($i=0,$count=count($array);$i<$count;$i++){}不要使用for($i=0;$i<count($array);$i++){}

        i、for($i=$total;$i>0;$i--){}性能要好于for($i=0;$i<$total;$i++){}

        j、保持循环体内的业务逻辑清晰

      3、函数

        a、函数职责清晰,一个函数只干一件事,不要糅杂过多的业务逻辑

        b、函数代码体不要超过20行,反之,考虑拆分

        c、优先使用PHP内置函数

        d、常量与函数同时能干一件事,优先使用常量。

        e、echo的性能好于print,输出多个变量的时候用echo $str1,$str2,不用.连接符

        f、$_SERVER[REQUEST_TIME]替换time()

        g、字符串替换strstr()->str_replace()->preg_replace()->epreg();

        h、发挥trim最大功效,替换substr。$filepath=trim($filename,' /').' /';

        i、isset/empty虽然两个函数功能有所差异,但在同样的情况下推荐使用empty()

        j、is_file/file_exists两个函数的功能有所不同,file_exists既可以判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐is_file

      4、文件

        a、减少文件包含数,减少磁盘IO

        b、使用完整路径,或者容易转化的相对路径。避免在include_path查找

        c、文件的代码行数不要超过2000行

        d、require_once/include_once效率低于require/include,需要额外的去查看系统是否已经调用过这个文件。因为它们在一个opcode缓存下调用非常慢

        e、程序执行文件用require/require_once,缓存文件用include/include_once。include效率好于require。

        f、优化spl中的文件自动加载机制

        g、类库文件加载,是否考虑类是否已经实例化,可以考虑采用设计模式之单例模式

        h、文件呢读写的并发性

      5、面向对象

        a、控制实例的创建的数量

        b、优先使用常量、类常量

        c、优先利用静态变量、静态属性

        d、类的结构合理

        e、面向对象接口编程

        f、封装变化点

        g、依赖于抽象、不依赖于细节

        h、优先使用静态成员

        i、类的接口清晰稳定,类的职责单一,类与类的通信合理

        j、使用常量的好处,编译时解析、没有额外开销、杂凑表更小,所以内部查询更快、类常量仅存在于特定【命名空间】,所以杂凑名更短,代码更干净,使除错更方便

      6、字符串

        a、用单引号替代双引号引用字符串

        b、避免检索字符串的变量

      7、运算

        a、用$i += 1代替 $i = $i + 1。符合C/C++的习惯,效率还高

        b、++$i的效率高于$i++,--$i同理

      8、数组

        a、多维数组尽量不要循环嵌套赋值

        b、使用$array['name']方式访问数组,禁止$array[name]或$array["name"]

      9、判断

        a、逻辑判断请优先使用switch的方式,对于业务逻辑相对较多的情况请选择if/else,提高代码的可读性

        b、尽量控制if/else判断的个数,如果太多情考虑功能优化或代码优化

        c、if/else与&&,单条语句判断请选择&&的形式,&&的效率高于if/else,如下:if($a == 1){$b = 2;}可选择为($a == 1) && $b = 2;

      缓存

      1、使用PHP加速器,缓冲opcode

      2、利用memcache/nosql

      3、使用内存数据库

      4、使用文件缓存

      6、缓冲功能

      其他

      1、少用@符号,严重影响性能

      2、实时关闭远程资源连接数据库,ftp、socket等,适时的清理这些资源

      3、合理的商业需求

      4、数据库shema架构优化

      5、垂直与水平分库分表

      6、索引优化,查询优化

      7、第三方开源检索工具(sphinx)

      8、主从数据库服务器

      9、Web服务器优化

      10、操作系统优化

      11、前端优化

        a、合理的html结构

        b、合理html与css的同时,考虑css设计合理,减少http请求

        c、合理html与javascript的同时,考虑拆分是否合理,减少http请求

        d、优化javascript代码,让用户有良好的体验

        e、根据http协议,优化高并发请求

  • 相关阅读:
    PHP7中php.ini、php-fpm和www.conf的配置(转)
    Linux下查看nginx、mysql、php的安装路径和编译参数
    Skip List(跳跃表)原理详解与实现【转】
    offset宏的讲解【转】
    Linux内核中的常用宏container_of其实很简单【转】
    Linux内核同步原语之原子操作【转】
    创建与合并分支【转】
    Git远程操作详解【转】
    【项目管理】git和码云的使用【转】
    Git和Github简单教程【转】
  • 原文地址:https://www.cnblogs.com/zhouguowei/p/5197514.html
Copyright © 2020-2023  润新知