# PHP性能如何优化
## 变量
> 变量的性能排行:局部变量 \> 全局变量 \> 类属性 \> 未定义的变量
1. 变量大小,注意变量大小是节约内存的最有效的手段。对于来自表单、数据库和文件缓存的数据都需要控制变量的大小。因为`CPU`要处理的数据是来源于内存。
2. 变量的有效期,使用`unset()`函数注销不需要的变量是一种好习惯,将一些不需要的变量立即注销可提高内存的使用率。
3. 变量类型,初始化变量请注意其变量类型,一个变量在执行过程中,最好只有一种类型状态。
4. 临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销。
5. 静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可以考虑使用静态变量,减少程序的`CPU`执行次数。
## 循环
1. 尽量减少循环的次数
2. 尽量减少循环嵌套的层次
3. 避免在循环内有过多的业务逻辑
4. 不要循环包含文件
5. 不要循环执行数据库操作
6. 优先使用`foreach`,它比`for、while`效率更高
7. 不要把`count、strlen、sizeof`放入`for`循环条件语句中
8. 保持循环体内的业务逻辑清晰
## 函数
1. 函数职责清晰,一个函数只干一件事,不杂糅过多的业务逻辑
2. 函数代码体不超过20行,反之考虑拆分
3. 优先使用`PHP`内置函数
4. 常量与函数同时能干一件事,优先使用常量
例如:
```
phpversion() < PHP_VERSION
get_class() < __CLASS__
is_null() < NULL
// 等等。。。
```
5. `echo`的性能好于`print`,输入多个变量的使用`echo $str1,$str2,$str3`,不用`.`连接符
6. 使用`$_SERVER['REQUEST_TIME']`替换`time()`
7. 字符串替换
~~~
strtr() > str_replace() > preg_replace() > epreg()
~~~
8. 发挥`trim`最大功效,替换`substr`
~~~
$file_path = trime($filename, '/').'/';
~~~
9. `isset/empty`虽然两个函数功能有所差异,但在同样情况下推荐使用`empty()`
10. `isfile/file_exists`两个函数的功能有所不同,`file_exists`既可判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐使用`is_file`
## 文件
1. 减少文件包含数,减少磁盘`IO`
2. 使用完整路径,或者容易转换的相对路径。避免在`include_path`查找
3. 文件的代码行数不要超过2000行
4. `require_once/include_once`效率低于`require/include`,需要额外的去查看系统是否已经调用过这个文件,因为它们在一个`opcode`缓存下的调用非常慢。
5. 程序执行文件用`require/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++`的习惯,效率还高
## 数组
> 多维数组尽量不要循环嵌套赋值
## 判断
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. `Web Server`
2. `ab`
3. `http_load`
4. `xdebug`
- PHP获取客户端浏览器信息和版本
- PHP获取客户端操作系统信息
- 无限级分类
- git使用
- 权限检测思路
- Vue学习
- 遇到的一些问题
- PHP的编码思维和技巧
- mysql复习
- tp5
- ThinkPHP5.x 公共函数
- TP5登录注册
- TP5使用模板继承
- ThinkPHP5.1 清除缓存
- thinkphp5实现安装程序
- 安全
- tp中实现跨域代码
- ThinkPHP5.1配合pjax实现菜单栏无刷新跳转
- 获取数据库版本和数据库大小
- 模型的基本CURD操作
- 商品spu
- 全局异常处理类
- ExceptionHandler
- BaseException
- PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
- 微信小程序
- wx:for
- tp6
- 分离的一些模块
- session开启
- Spring
- 依赖注入
- 数据结构
- 二叉树
- js获取地址栏变量
- PHP设计模式
- 面向对象
- PHP1
- PHP性能优化
- Java学习
- static关键字
- 多态
- 接口、阶乘
- 大佬给的面试题
- 访问量为5000万的博客系统设计
- PHP可变参数
- Nginx的配置案例
- 求数组中的最大值,并返回数组索引
- PHP面试方向
- PHP数组工具类ArrUtil
- 字符串工具类StrUtil
- PHP使用curl发送请求
- mysql
- PHP上传base64图片处理函数
- webstorm小程序常用配置
- 邮箱正则表达式
- leetcode mysql记录
- 函数库