PHP 的性能优化

PHP 性能优化初探

什么情况下,会遇到了 PHP 性能问题?

  • PHP 语法使用得不恰当
  • 使用 PHP 语言做了它不擅长做的事情
  • 使用 PHP 语言连接的服务不给力
  • PHP 自身的短板
  • 尚未排查出的问题

PHP 性能问题简析

PHP 的性能问题,占整体项目性能问题的比例一般是三成,但也不仅仅局限于对 PHP 的性能优化。

PHP 的性能问题的解决方向,优化难度是从简单到困难

  • PHP 语言级的性能优化
  • PHP 周边问题的性能优化
  • PHP 底层级的性能优化

压力测试工具简介

Apache Benchmark(ab)

简介

ApacheBench 是 Apache 服务器自带的一个web压力测试工具,缩写为 ab ,旨在高压高并发下体现出各种问题和瓶颈.
ab 命令会模拟多个用户同时访问一个url (伪装一个并发访问的环境).
此命令对本地cpu要求不高,内存要求也不多,但是会对访问目标服务器造成严重的负载甚至资源耗尽而宿机,很类似与cc攻击.

如何使用

./ab -n1000 -c100 http://www.baidu.com/,其中 -n 是请求书,-c 是并发数,后面的是压测地址。

压测呈现的数据,比较重要的三个

  • Requests per second: 每秒处理的请求
  • Time per request: 每处理一个请求所消耗的时间
  • Time taken for test: 完成这次压测所消耗的时间

PHP 语言级的性能优化

优化点:产生额外开销的错误抑制符 @

  • 情况描述:PHP 提供的错误抑制符只是为了方便懒人
  • @ 的实际逻辑:在代码开始前、结束后,增加 Opcode,忽略报错
  • vld - PHP Opcode 查看扩展
  • 举例说明:file_get_contents()

    1
    php -dvld.active=1 -dvld.execute=0 XXX.php 只查看不执行
  • 好的建议:尽量不要使用 @ 错误抑制符

优化点:合理使用内存

  • 情况描述:PHP 有内存回收机制保底,但也请小心使用内存
  • 好的建议:利用 unset 及时释放不使用的内存

优化点:减少计算密集型业务

  • 情况描述:PHP 不适合密集型运算的场景
  • 为什么:PHP 语言特性决定了 PHP 不适合做大数据量运算
  • PHP 使用场景:适合衔接 Webserver 与后端服务、UI 呈现

优化点:务必使用带引号字符串做键值

  • 情况描述:PHP 会将没有引号的键值当做常量,产生查找常量的开销
  • 好的建议:严格使用引号作为键值

PHP 周边问题的性能优化

  • Linux 环境
  • 网络的性能
  • 缓存的性能
  • 数据库的性能
  • 服务器硬盘的性能

php => 网络 =》 DB 的场景,找出问题的和核心,并且找到大头去优化。

减少文件类操作:

  • PHP 常见的开销场景
    • 读写硬盘
    • 读写数据库
    • 读写内存
    • 读写网络数据
  • PHP 常见的开销场景的开销次序
    • 读写内存 小于 读写数据库
    • 读写数据库 小于 读写硬盘
    • 读写硬盘 小于 读写网络数据(网络延迟)
    • 读写数据库、读写硬盘、读写网络数据都是基于文件类操作
  • 优化网络请求
    • 问题
      • API 的不确定因素
      • 网络稳定性
    • 如何优化
      • 1.设置超时时间
        • 连接超时 200ms
        • 读超时 800ms
        • 写超时 500ms
      • 2.将串行请求并行化
        • 使用 curlmulti*()
        • 使用 Swoole 扩展

压缩 PHP 接口输出

  • 如何压缩
    • 使用 Gzip 即可
  • 压缩输出的利与弊
    • 利于我们的数据输出, Client 端能更快获取数据
    • 额外的 CPU 开销(如果传输数据大于 100 KB,能取得不错的效果)

缓存重复计算内容

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

重叠时间窗口思想:

- 串行
- 重叠时间窗口思想

如果后一个请求不强依赖前一个请求的返回结果,可以使用将网络请求并行化。

旁路方案

如果后一个请求不强依赖前一个请求的返回结果,可以使用旁路方案。

PHP 性能问题的具体分析

工具:XHPorf(源自 Fackbook 的 PHP 性能分析工具)
实践:通过分析 Wordpress 程序,做优化

PHP 性能瓶颈解决方法

Opcode Cache: PHP 扩展 Yac
扩展实现:通过 PHP 扩展代替原 PHP 代码中高频逻辑
Runtime 优化:HHVM,PHP-JIT