zoukankan      html  css  js  c++  java
  • PHP优化思路

    想起来记录一下自己对PHP的优化思路

    针对Nginx和 PHP-FPM进行优化

    首先应该分为代码层面、配置层面、架构层面

    代码层面 参见了https://segmentfault.com/a/1190000009442044 这篇文章

    代码层面也可以参考鸟哥的博客:http://www.laruence.com/2011/05/31/2018.html


    1.减少PHP代码量

    显而易见,PHP作为解释性语言,每次执行都要解析编译到OPCODE,如果代码量越大,需要从PHP代码解析到OPCODE的工作量就越大,这时,可以尝试尽量多的采用系统内置函数。PHP系统对String Array File等操作函数很多,其底层实现为C,自然要比我们写PHP代码要来的快。

    2.错误抑制符号 @ 尽量不用,会影响性能

    3.少用正则表达式,PHP自带String 相关函数功能很强大,类似strstr() strrchr() strpos() strrpos()等,因为正则表达式会导致过多的回溯,比较占用CPU。

    4.避免在循环内做计算

    ZendEngine也许不够聪明,循环内每次循环都会做相应的计算。

    eg:

    <?php
    
    $arr = range(1,1000);
    
    for($i = 0;$i < count($arr);$i++){//sth}
    for($i = 0,$j = count();$i < $j;$i++) {} // ok
    // 这会导致每次循环都计算count,因此效率会低一些

    5.类内方法,非必需面向对象,定义为Static会提升性能 static耗时:对象函数耗时 1:4

    6.误区:require、include等函数在使用带变量的引入其他脚本,会导致性能缺失嘛? 不会,realpath _cache 了解一下

    7.switch性能优于if elseif  因为switch在比较的时候,底层会形成类似HashMap的结构,以O(1)的效率找到执行分支,if不会。

    8.非必需情况下,少使用全局变量。

    9.$i++会比$++i慢一些

    https://github.com/xiaoerli520/TestSomeThingInPHP 请看我的库的结论,通过OPCODE可以看出

    这边可以看到 ,$i++ 是多了一步 FREE的操作 应该是将临时变量Free掉了

    因为$i++是 需要将当前值返回之后再加 因此需要一个临时变量去做返回

    ++$i是返回增加之后的,过程中无需产生临时变量,也不用去free临时变量,效率较高

    10.foreach效率更高

    11.少用魔术方法__set() __get()

    12 一些方法可以由常量代替

    13. 使用include require 而不是 once

    include_once (require_once)语句在脚本执行期间包含并运行指定文件。此行为和 include (require)语句类似,区别是如果该文件中的代码已经被包含了,则不会再次包含,只会包含一次。include_once(require_once)需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载。 这样会多一步Hash lookup

    计时证明: http://www.php.cn/php-weizijiaocheng-382995.html

    配置层面 (自己的认识还比较浅薄)

    1. php-fpm 运行模式 https://blog.csdn.net/baidu_21154279/article/details/54929664

    如果内存大,使用静态模式,pm.workers数量为 内存大小 / 30M 避免线程开闭导致的开销

    如果内存小,使用动态模式 pm workers 数量为 内存大小 / 20M

    动态模式能更好的规避内存泄露相关问题,例如exec执行某些指令失败,可以考虑重启FPM(USR2)

    2.php OPCACHE 

    使用Opcache扩展能更好的提升性能,其默认缓存最小粒度当然是脚本文件,缓存根据是脚本的mtime ,因此注意rsync带来的坑,默认缓存文件个数为 2k, 默认缓存时间1s 后自动检查更新。

    3.php realpath cache

    使用realpath cache能更好的令PHP进行require include等操作。

    4.php-fpm 与 nginx的沟通模式

    默认使用TCP socket进行沟通,如果PHP和nginx是1:1的关系,那么不妨使用Unix socket ,这样能减少TCP协议相关压力,避免回环,提升性能,但是可能稳定性会稍微降低一些。

    5.数据库presistent持久链接配置启动,可以实现长连接,提升性能。

    架构层面  

    1. 使用Cache,类似Memcache,Redis等,减少数据库压力(注意缓存穿透时的回原压力)

    2. 使用MQ进行削峰,异步调度总能性能更加

    3.接入层负载均衡,可以根据不同的配置,分发不同的权重等

    4.DB读写分离

  • 相关阅读:
    Java之事件处理
    Java之图形程序设计
    小议设置path环境变量
    关于JAVA中的编译和解释执行
    并发工具类 CountDownLatch
    线程池
    Properties的小问题
    转换流
    TCP中客户端和服务器的理解
    leetcode_160. 相交链表
  • 原文地址:https://www.cnblogs.com/xiaoerli520/p/9629766.html
Copyright © 2011-2022 走看看