GVKun编程网logo

PHP性能优化(PHP性能优化的方法)

18

对于PHP性能优化感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍PHP性能优化的方法,并为您提供关于php性能优化之opcache-让你的php性能提升50%、PHP性能优化-实战篇、PHP性

对于PHP性能优化感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍PHP性能优化的方法,并为您提供关于php 性能优化之opcache - 让你的php性能提升 50%、PHP性能优化 -实战篇、PHP性能优化 -理论篇、PHP性能优化 产生高度优化代码的有用信息。

本文目录一览:

PHP性能优化(PHP性能优化的方法)

PHP性能优化(PHP性能优化的方法)

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

如何优化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 循环的条件语句中 For($i=0,$count=count($array);$i<$count;$i++){} 不要使用for($i=0;$i<count($array);$i++){};

8)、 for($i=$total;$i>0;$i–){}性能好于for($i=0;$i<$total;$–){}

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

 

三、函数(重要)

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

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

3)、 优先使用PHP内置函数

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

         例如:

            · PHPversion() < PHP_VERSION

            · get_class() < __CLASS__

            · is_null() < NULL ===

5)、 echo 的性能好于print,输入多个变量的时候用echo $str,$str1,不用.连接符

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

 

四、文件(重要)

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)、 用单引号替代双引号引用字符串;避免检索字符串中的变量

 

七、运算

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

2)、 ++$i 的效率高于++$i,–$i 同理[/hide]

 

八、数组

1)、 多维数组尽量不要循环嵌套赋值;

2)、 使用$array[‘name’]方式访问数组,禁止$array[name]/$array[“name”]

广州品牌设计公司https://www.houdianzi.com

九、判断(重要)

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

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

3)、 尽量使用恒等用于比较判断,恒等的效率高于等于,而且还能避免一些类型强制转换的错误

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)、 主从数据库服务器的使用。

 

十三、 前端优化

1)、合理的 html 结构

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

3)、合理 html 与java script 的同时,考虑拆分是否合理,减少 http 请求

4)、优化 java script 代码,让用户有良好的体验

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

 

十四、性能检测工具(重要)

只要在百度上搜索“xxx如何检网站性能”即可。

1)、Web Server

2)、ab

3)、http_load

4)、PHP

5)、apd

6)、xdebug

7)、MysqL

8)、explain

9)、profiler

php 性能优化之opcache - 让你的php性能提升 50%

php 性能优化之opcache - 让你的php性能提升 50%

性能提升原理:减少文件解析的时间。

我们都知道,程序要运行,得有一个编译或者解析的过程,编译或解析之后的代码才是机器可以运行的。

而 php 是一种解析性语言,在使用php来处理http请求的时候,每一个请求到来的时候,都需要把所有用到的文件解析一遍。

而用了 opcache 的话,解析一次就可以多次使用,而不需要每次都从硬盘读取文件,然后再解析,所以会有大幅的性能提升。

 

php -v 看看是什么版本的,然后去下载对应版本的源代码

进源代码目录下的 ext/opcache,

然后

phpize

./configure --with-php-config=/usr/local/php/bin/php-confie

make

sudo make install

 在配置文件末尾添加:(参考:一个关于Zend O+的小分享)

zend_extension=opcache.so
opcache.enable_cli=1
opcache.memory_consumption=128      //共享内存大小, 这个根据你们的需求可调
opcache.interned_strings_buffer=8   //interned string的内存大小, 也可调
opcache.max_accelerated_files=4000  //最大缓存的文件数目
opcache.revalidate_freq=60          //60s检查一次文件更新
opcache.fast_shutdown=1             //打开快速关闭, 打开这个在PHP Request Shutdown的时候
                                     //   会收内存的速度会提高
opcache.save_comments=0             //不保存文件/函数的注释

  

然后重启 fpm 就可以了。

 

具体效果:

我们可以看到,耗费时间大概少了50%。

 

  

PHP性能优化 -实战篇

PHP性能优化 -实战篇

借助xhprof 工具分析PHP性能

XHPorf(源自Fackbook 的PHP性能分析工具)

实战
    通过分析WordPress程序,做优化!

    优化

    找到需要优化的函数

    grep 'import_from_reader' ./ -r



PHP性能分析工具扩展

    ab - 压力测试
    vld - opcode代码分析


PHP性能瓶颈究极办法

    Opcode Cache:PHP扩展APC  pecl.PHP.net -> 搜索 APC (2012以后不再维护了)

    yac (也不错)

    扩展实现:通过PHP扩展代替原PHP代码中高频逻辑

    Runtime优化:HHVM

 

附:
    PHP7环境

    xhprof 并用于tp5框架

    git clone https://github.com/longxinH/xhprof

    cd xhprof/extension/
    PHPize
    ./configure
    make
    make install

    然后在/etc/PHP.ini中根据情况加入

    extension=xhprof.so

    重启

    PHPinfo() | PHP -m | grep xhprof 查看 是否安装成功

    //查看性能 图 需要安装
    yum install graphviz

    把xhprof_lib目录下的utils/xhprof_lib.PHP内容全部添加到你的项目的common.PHP文件里

    把utils/xhprof_runs.PHP文件copy到你的项目文件的Lib/ORG/下
    (utils/xhprof_runs.PHP 放入extends 通过 Loader::import('Shprof.xhprof_runs',EXTEND_PATH,'.PHP'); 调用)

    具体调用

    xhprof_enable();

    $xhprof_on = true;

    ////

    //此处为你的程序

    ///

    if($xhprof_on){

    $xhprof_data = xhprof_disable();

    import("Lottery.ORG.XHProfRuns_Default");

    $xhprof_runs = new XHProfRuns_Default();

    $run_id = $xhprof_runs->save_run($xhprof_data, "eagle");//(eagle为命名空间,你可以随意取)

    echo ''<a href="http://web.caoqi.com/xhprof/xhprof_html/index.PHP?run=''.$run_id.''&source=eagle" target="_blank">统计</a>'';

 

PHP性能优化 -理论篇

PHP性能优化 -理论篇

什么情况下,遇到了PHP性能问题?
    1 PHP语法使用的不恰当
    2 使用PHP语言做不了它不擅长做的事
    3 用PHP语言连接的服务不给力
    4 PHP自身的短板
    5 我也不知道的问题



性能问题解析

        PHP的性能问题,占整个项目性能问题的比例 不到50%

        性能优化项目,不要局限于仅优化PHP


    PHP语言级的性能优化
            |
            |
            |
    PHP周边问题的性能优化
            |
            |
            |
    PHP语言自身分析,优化



PHP 压力测试工具ab简介

Apache Benchmark(ab)(可以自行下载)
    ab是由Apache提供的压力测试软件,安装apache服务器时会自带该压测软件。


如何使用?

    ./ab -n1000 -c100 http://www.baidu.com/

         -n请求数

                 -c并发数

                         url目标压测地址


PHP-压力测试工具使用演示


    主要关注 每秒并发尽可能的多

    请求耗时尽可能的少

多使用PHP自身能力

    优化:少写代码,多用PHP自身能力

        性能问题: 自身代码冗余较多,可读性不佳,并且性能低

    为甚性能低?
         PHP代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。

    好的方法:
        多使用PHP内置变量\常量\函数

PHP自身能力性能测试之代码准备

    
PHP代码运行流程


*.PHP ---Scanner---> Exprs -----Parser--->Opcodes---Exec--->Output


PHP内置函数之间的性能测试

    优化点:PHP内置函数的性能优劣

        情况描述: PHP内置函数,之间依然存在块慢差异
        好的建议: 多去了解PHP内置函数的时间复杂度


PHP内置函数之间的性能测试之代码测试

    isset($arr[$i]); //平均50ms
    array_key_exists($i,$arr);//平均85ms


减少PHP魔法函数的使用

    情况描述:  PHP提供的魔法函数,性能不佳
    为什么性能低 为了给PHP程序猿省事 PHP语言为你做了很多

    好的方法   尽可能规避使用PHP魔法函数




PHP 禁用错误抑制符

    @的实际逻辑

        在代码开始前 结束后 增加 Opcode 忽略报错

    PHP -dv|d.active=1 -dv|d.execute=0 at.PHP

    只是想查看并不是真的想执行

PHP-合理的使用内存和正则表达式

    优化点:合理使用内存

    PHP有内存回收机制保底,但也请小心使用内存

    好的建议  
         利用unset() 及时释放不使用的内存(注:unset()出现注销不掉的情况)


    尽量少的使用正则表达式

        正则表达式的回溯开销较大,

    好的建议:
        利用字符串处理函数,实现相同逻辑


PHP-避免在循环内做运算

    优化点:避免在循环内做运算

    情况描述:
        循环内的计算式将会被重复计算

    代码示例:
        <?PHP
            $str = "hello world";
            for($i=0;$i<strlen($str);$i++)
            {
                //do something
            }


PHP-减少计算密集型业务

    PHP不适合密集型运算的场景

    PHP语言特性决定了PHP不适合做大数据量运算


PHP适合场景

    适合衔接Webserver与后盾服务,UI呈现


PHP-务必使用带引号字符串做键值

    PHP会将没有引号的键值当做常量,产生查找常量的开销

    严格使用引号的字符串作为键值


PHP周边问题的分析与阐述

    PHP周边都有什么?

        linux运行环境  PHP   硬盘(文件存储)  数据库(例如MysqL) 缓存 网络


PHP周边对PHP程序的影响分析



减少文件类的操作

    常见PHP场景的开销次序:

        读写磁盘 读写数据库 读写内存 读写网络数据

        读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据


减少PHP发起网络请求
    
    网络请求的坑:
        1 对方接口的不确定因素
        2 网络稳定性
    优化网络请求

        1 设置超时时间
            连接超时 200ms
            读超时   800ms
            写超时   500ms
        
        2 将串行请求并行化

            1 curl_multi_*()
            2 使用swoole扩展

        curl_multi_*()不是很好,因为他是按最长的一个返回的时间来定的

        curl_multi_add_handle 向curl批处理会话中添加单独的curl句柄
        curl_multi_close 关闭一组cURL句柄
        curl_multi_exec 运行当前cURL句柄的子连接
        curl_multi_getcontent 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
        curl_multi_info_read 获取当前解析的cURL的相关传输信息
        curl_multi_remove_handle 移除curl批量处理句柄资源中的某个句柄资源
        curl_multi_select 等待所有cURL批处理中的活动连接
        curl_multi_setopt Set an option for the cURL multi handle
        curl_multi_strerror - Return string describing error code


        推荐swoole扩展来做


压缩PHP输出的利与弊
    压缩PHP接口的输出
    如何压缩?

        使用Gzip即可

    利  利于我们的数据输出,Client端能更快获取数据
    弊  额外的cpu开销

PHP缓存复用

    什么情况下做输出内容的缓存?
        多次请求,内容不变情况


Smarty调优和重叠时间窗口思想

    Smarty开启 caching

    重叠时间窗口思想   

        串行:
            Process1 Process2 Process3 Process4

        重叠时间窗口:

            process1
                process2
                    process3
                        process4

    后一个任务不强依赖前一个任务的时候,可以使用重叠时间


PHP旁路处理方案

    一般普通的:x.PHP -> Process1 ->process2 ->process3 -> process4->
    
    旁路方案: x.PHP -> Process1 ->process2(同时) ->Process3 (同时) -->Process4->

PHP性能优化 产生高度优化代码

PHP性能优化 产生高度优化代码

1.将PHP升级到最新版


  提高性能的最简单的方式是不断升级、更新PHP版本。

  2.使用分析器

  网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。   Xdebug PHP extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具 KCachegrind中。

  3.检错报告

  PHP支持强大的检错功能,方便你实时检查错误,从比较重要的错误到相对小的运行提示。总共支持13种独立的报告级别,你可以根据这些级别灵活匹配,生成用户自定义的检测报告。

  4. 利用PHP的扩展

  一直以来,大家都在抱怨PHP内容太过繁杂,最近几年来开发人员作出了相应的努力,移除了项目中的一些冗余特征。即便如此,可用库以及其它扩展的数量还是很可观。甚至一些开发人员开始考虑实施自己的扩展方案。

  5.使用PHP加速器

  一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。如果PHP脚本经过反复编译而得到相同的结果,那为什么不完全跳过编译过程呢?   通过PHP加速器,你完全可以实现这一点,它缓存了PHP脚本编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程。   对PHP开发人员而言,目前提供了两种可用的缓存方案,一种是APC(Alternative PHP Cache,可选PHP缓存),它是一个可以通过PEAR安装的开源加速器。另一种流行的方案是Zend Server,它不仅提供了操作码缓存技术,也提供了相应页面的缓存工具。

  6.通过内存缓存来避免高成本操作


  PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用 Memcached extension来缓存数据。Memcached的扩展缓存与libmemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。   英文原文:http://www.PHPbuilder.com/columns/PHP-performance-tips/Jason_Gilmore07122011.PHP3?page=1

今天关于PHP性能优化PHP性能优化的方法的讲解已经结束,谢谢您的阅读,如果想了解更多关于php 性能优化之opcache - 让你的php性能提升 50%、PHP性能优化 -实战篇、PHP性能优化 -理论篇、PHP性能优化 产生高度优化代码的相关知识,请在本站搜索。

本文标签: