zoukankan      html  css  js  c++  java
  • PHP服务端优化全面总结

    一.优化PHP原则

    1.1PHP代码的优化

    (1)升级最新的PHP版本

    鸟哥PPT里的对比数据,就是WordPress在PHP5.6执行100次会产生70亿次的CPU指令执行数目,而在PHP7中只需要25亿次,减少64.2%。
    参考:PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)

    (2)减少include和require的使用

    include和require方法中包含了文件读取逻辑,大量使用会造成性能的下降.
    解决这个问题可以使用APC加速器组件,缓解此类问题.

    (3)使用局部变量代替全局变量

    局部变量的速度比全局变量运行的速度要快,使用局部变量可以提高运行效率,同时也易于管理.

    (4)使用静态函数和方法

    结合实际情况,尽量添加static标签,使用静态函数或者方法,可以有效的提升执行速度.

    (5)及时释放无用的变量和资源

    PHP自带内存回收机制,但是我们不能过分的依赖,我们要通过unsettle方法,或者直接设置为null的方式来及时的释放无用的变量和资源.

    (6)使用单引号代替双引号

    单引号和双引号都可以用来包含字符串,但是双引号有字符转义和变量解析的逻辑,所以尽量使用单引号,提升执行效率.

    (7)减少@屏蔽错误的使用

    @号可以用来屏蔽报错的信息,但是需要注意的是@会降低脚本的运行速度.

    (8)减少PHP中OOP的使用

    使用OOP来构建程序框架比较便捷,但是可能会产生额外的系统开销.所以我们要根据实际情况合理的使用OOP思想.

    (9)使用抽象类代替接口

    PHP中使用接口(interface)的成本比较高,我们应该尽量避免使用,可以使用抽象类(abstract class)来代替.

    (10)减少正则表达式的使用

    正则表达式的执行成本十分的高昂,尽量使用PHP中自带的字符串处理函数来代替.

    (11)压缩需要存储的数据

    例如我们保存IP地址的时候可以使用ip2long函数把IP地址转化成整数型数据存储,使用的时候通过long2ip函数还原.
    对大数据还可以使用gzcompress和gzuncompress进行压缩和解压.

    (12)使用高效的PHP语句

    分支语句效率:switch ... case>if ... elseif ... else.
    循环语句效率:foreach>for>while.
    叠加语句效率:++$i>$i++.

    (13)使用高效的PHP函数

    字符打印函数效率:echo>print
    字符替换函数效率:strtr>str_replace>preg_replace
    数组查询函数效率:array_key_exists>isset>in_array

    1.2Session机制的优化

    (1)在PHP session设置中避免开启auto_start,通常在使用的时候在使用session_start函数开启,减少资源消耗.

    (2)合理设置session的有效期,有效期设置过长导致出现负载问题,通常设置在1到8小时之间.

    (3)PHP session默认使用文件存储,我们可以通过php.ini中的session_handle选项选择需要的存储方式,常见的有数据库和高速缓存服务Memcache Redis等.

    1.3使用缓存中间件

    (1)Memcache

    (2)Redis

    1.4使用APC加速

    二.数据库优化

    2.1SQL优化

    (1)使用慢查询.

    在MySQL数据库配置文件my.cnf中加入配置,使用show status like 'Slow%'查看慢查询数量.
    分析查询时间大于设置时间的SQL语句,使用explain语句.

    (2)使用索引

    where:使用确定性的判断添加字段一般加索引
    like: 'faf%'使用索引,'%faf%'不能使用索引
    少用不确定的判断.如:!=,is not null, not in等.索引非常占据空间,合理创建索引.

    (3)使用表关联需要慎重

    常用的内连接(inner join)和左连接(left join)每次进行关联查询的时候都会对两张数据表的笛卡尔乘积进行查询,扫描数量大,所以我们尽量使用添加冗余字段避免表关联,使用空间换时间.

    如果难以避免使用表关联,那么我们最好给关联的字段建立索引.

    不要使用SQL的子查询,效率非常的低.

    (4)使用MySQL中查询条件和函数要谨慎

    不要使用查询数量的COUNT(*),而是使用COUNT(1).
    尽量不要使用DISTINCT.
    group by计算十分消耗资源.
    max(),min(),substr(),concat(),date_format(),to_days()等都会加大数据库负担.
    我们应尽量让数据库负责查询工作,其他使用PHP来做.

    2.3数据库架构设计

    (1)主从结构

    主库负责数据写入,从库负责数据查询,主库写入后快速同步从库.
    主从架构既能避免读写造成的锁表问题,又能多台从库分担访问.
    但应该注意同步不及时问题.例如,用户修改信息时,主库更新.而从从库获取数据时,从库却没有从主库同步过来.就会造成信息无变化现象.

    (2)集群(Cluster)

    当主从结构无法满足需求时,我们可以使用集群结构.由众多的主从结构数据库组成集群.

    集群架构对分布式逻辑要求比较高,通常是使用唯一的字段作为分布式数据的ID,通过散列分布算法获得数据所在位置,常见的算法有取模算法,一致性散列算法等.

    还可以按照数据库名来实现分布式存储数据.这种算法比较简单实用,由于数据库的相关功能不同,每个数据库访问量和数据量也不平均,所以可以按照数据库名来处理.

  • 相关阅读:
    《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤
    Linux下进程线程,Nignx与php-fpm的进程线程方式
    solr全文检索实现原理
    LSM树以及在hbase中的应用
    MySQL的MyISAM与InnoDB的索引方式
    MySQL的innoDB存储引擎的运作方式,数据结构等
    Redis作缓存
    Redis的几点积累
    Redis数据库各种数据结构的内部实现。
    正则表达式!!!
  • 原文地址:https://www.cnblogs.com/cnlihao/p/6623183.html
Copyright © 2011-2022 走看看