一、语言级性能优化(一)

PHP 性能问题的解决方向

PHP语言级别的性能优化 =》 PHP周边问题的性能优化 =》 PHP语言自身分析、优化

1.压力测试工具 Apache Benchmark (ab)

(1)测试工具基本介绍

1). ab 是由 Apache 提供的压力测试软件,安装 apache 服务器时会自带该压力测试软件

2). 基本使用[Linux 平台]

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

# -n 请求数

# -c 并发数

# url 目标压力测试地址

3). 参考项

# 每秒接收请求数 =》 尽可能大

Requests per second (mean)

# 每一个请求的耗时情况 =》 尽可能小

Time per request (mean, across all concurrent requests)

2.PHP 自身能力

(1)优化点:少写代码,多用 PHP 自身能力

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

2). 为什么性能低:PHP 代码需要编译解释为底层语言,这一过程每次请求都会处理一遍,开销大。

3). 好的方法:多实用 PHP 内置变量、常量、函数。

(2)PHP 代码运行流程

.php文件 =>[zend引擎 Scanner]=> zend exprs => [Parser] => Opcodes(要被执行的代码) => [Exec] => Output

【补充】目前很多 php 的缓存服务使用的都是 opcode,节省了扫描和解析的过程,提升速度。

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

1). array_key_exists() vs isset()

php 执行效率上: isset > array_key_exists

二、语言级性能优化(二)

1.优化点:减少 PHP 魔法函数的使用

(1). 情况描述:

PHP 提供的魔法函数,性能不佳

(2). 为什么性能低:

为了给 PHP 程序员省事,PHP 语言为你做了很多

(3). 好的方法:

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

【补充】:命令行模式查看 php 文件执行耗时

# time命令

time php test.php

# 输出结果

real

user => 主要参考的耗时

sys

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

(1).情况描述:

PHP 提供的错误已支付只是为了方便懒人

(2). @ 的实际逻辑:

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

vld - PHP Opcode 查看扩展

(3).错误抑制符的性能测试

1)测试文件at.php

//at.php

file_get_contens('xxx'); // xxx文件不存在

2)使用 vld 扩展执行at.php,查看执行过程的完整 Opcode

php -dvld.active=1 -dvld.execute=0 at.php

# 不加@错误抑制符时Opcode的执行情况

SEND_VAL

DO_FCALL

RETURN

# 加@错误抑制符时Opcode的执行情况

BEGIN_SILENCE

SEND_VAL

DO_FCALL

END_SILENCE

RETURN

(4).好的建议:尽量不要使用@错误抑制符

可以使用 try throw 方式进行错误控制

3.优化点: 合理使用内存

(1)情况描述:

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

(2)好的建议:

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

4.优化点: 尽量少的使用正则表达式

(1) 情况描述:

正则表达式的回溯开销比较大,"没有金刚钻别揽瓷器活"

(2) 好的建议:

利用字符串处理函数,实现相同逻辑

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

(1) 情况描述:

循环内的计算式将会被重复计算

(2) 代码示例:

$str = "hello world";

for ($i=0; $i < strlen($str); $i++) {

# code...

}

// 其中strlen()方法会在每次循环时计算一次

// 进行优化

$str = "hello world";

$strlen = strlen($str);

for ($i=0; $i < $strlen; $i++) {

# code...

}

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

(1) 情况描述:

PHP 不适合密集型运算的场景[大批量日志分析、大批量数据处理]

(2) 为什么?

PHP 语言特性决定了 PHP 不适合做大数据量运算。[需要解析成 C 语言进行运算,C 语言可能几行代码就实现的计算,php 可能需要很多行代码才能实现]

(3) PHP 适用场景:

适合衔接 Webserver 与后端服务、UI 呈现[纽带]

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

(1) 情况描述:

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

【补充】:

# 将后台运行的任务放到前台终端运行

fg

# 相关命令: jobs bg fg

# 将任务号为1的任务从后台执行转换到其那台执行。

fg 1

# 执行上述命令后,命令行窗口将显示如下信息

find / -name password

(2) 程序说明

define('key', 'imooc');

$array = array(

'key' => 'hello world!',

'imooc' => 'http://www.imooc.com/'

);

echo $array["key"] . '\n'; // 输出 hello world

echo $array[key] . '\n'; // 输出 http://www.imooc.com/

【说明】:

当时用$array[key]时,程序也把 key 作为常量去查找,当查找到时,获取到常量的值;当没查找到时,再到数组内部,将其作为键 key 字符串进行解析

(3) 好的建议:

严格使用引号作为键值

三、PHP 周边问题的分析与阐述

1.PHP 周边范围:

Linux 运行环境

文件存储[磁盘]

数据库[mysql]

缓存[硬件的内存、php 缓存技术:memcache redis]

网络

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

(1) 连接数据库操作

同一台服务器 => 数据库优化 决定时间性能

分布式服务器 => 数据库优化 + 网络速度 决定时间性能

(2) 减少文件类操作

1) 常见 PHP 场景的开销次序:

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

2) 时间开销:

读写内存 <

数据库会使用内存作为缓存,将其热数据先缓存在内存中,异步地写入到数据库 =》 数据库介于内存和磁盘之间

网络数据:通过socket发起,socket使用的是本地的文件句柄,磁盘操作。受网络延迟影响,延迟大时远远小于读写磁盘,延迟小时和读写磁盘差不多。

3) 总结:

尽可能多的使用读写数据库、读写内存,尽量规避操作磁盘和操作网络数据。

(3) 优化网络请求

网络请求的坑:

1.对方接口的不确定因素 2.网络稳定性

如何优化网络请求?

1.设置超时时间

a) 连接超时

b) 读超时

c) 写超时

2.将串行请求并行化

a) 使用 curlmulti*() => 最简单,但是并不是最好用

b) 使用 swoole 扩展 => 效果更好

(4) 压缩 PHP 接口输出

如何压缩?

使用 Gzip 即可。

2)利与弊:

利: 利于我们的数据输出,Client 端能更快获取数据

弊: 额外的 CPU 开销

(5) PHP 缓存复用

什么情况下做输出内容的缓存?

多次请求,内容不变的情况。[模板缓存]

|---Cached----/\

\/ |

.php Cache -> No Cache

/\ |

|---------\/

(6) 重叠时间窗口思想

串行:

process1[客户端] process2[web server] process3[php] process4[mysql或缓存]

重叠时间窗口:

process1

process2

process3

process4

使用前提:后一个任务不强依赖于前一个任务的输出或返回。

(7) PHP 旁路处理方案

x.php x.php

| |

process1 process1

| |---------process2

process2 process3 |

| |

process3 process4

|

process4

使用前提:后一个任务不强依赖于前一个任务的输出或返回。

四、具体的性能分析

1. 借助 xhprof 工具分析 PHP 性能

工具: XHProf [源自 Facebook 的 PHP 性能分析工具]

实践: 分析 Wordpress 程序,做优化

(1)准备工作

1) 检查 xhprof 工具是否安装成功

php --ri xhprof

//输出

xhprof

xhprof => 0.9.2

CPU num => 1

2) 在 wordpress 代码中[index.php 文件]

1.在起始位置添加`xhprof_enable()`进行开启xhprof

2.在执行结束位置添加`xhprof_disable()`返回性能分析数据

3.添加xhprof的两个lib文件

wordpress/index.php 代码

xhprof_enable();

define('WP_USE_THEMES', true);

require(dirname(__FILE__) . '/wp-blog-header.php');

$data = xhprof_disable();

include_once "/var/www/html/xhprof_lib/utils/xhprof_lib.php";

include_once "/var/www/html/xhprof_lib/utils/xhprof_runs.php";

$objXhprofRun = new XHProfRuns_Default();

$run_id = $objXhprofRun->save_run($data, "test");

var_dump($run_id);

3) wordpress 同级目录下的 xhp 目录

callgraph.php

css/

docs/

index.php

jquery/

js/

typeahead.php

4)浏览器访问 xhp/index.php

查看列表形式的性能分析 =》 View Full Callgraph =》 查看图形流程分析[查看耗时最长的文件和方法]=>MO::import_from_reader| MO::make_entry

5)查找最需要优化的文件

grep 'import_from_reader' ./ -r

6)主要耗时点:MO::make_entry() -- 执行的是多语言支持的功能

优化方式:直接注释掉调用的相关代码

【补充】:MO和PO都是 PHP 处理多语言程序的语言包

7)优化结果:

让程序不再是只有一个或一处相互关联的高消耗代码点。

2. PHP 性能分析工具扩展

XHProf -- PHP性能分析工具

ab -- 压力测试

vld -- opcode代码分析

五、PHP 性能瓶颈终极办法

1.Opcode Cache: PHP扩展APC

官方地址:前往

已不再更新。

【补充】:pecl.php.net是php扩展的官方维护站点。了解并使用类似APC的opcode 缓存扩展?

yac - 通过共享内存来缓存用户数据,用于代替APC和本地memcached的方案。

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

3.Runtime优化: HHVM

apache php 调优_性能优化之PHP优化相关推荐

  1. apache php 调优_记一次apache+php调优

    近日手头拿到了一个调优问题,详细一看,发现是apache+php问题,问题的具体表现如下: 正常运行的服务常常停止响应, 一旦停止响应, 维护人员就不得己需要去重启apache服务 对php不熟,调查 ...

  2. OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  3. java面试 系统调优_面试官:Java性能调优你会多少?一个问题就把我问的哑口无言,哭了!...

    一.前言 什么是性能调优? 性能调优其实很好理解,就是优化硬件.操作系统.应用之间的一个充分的协作,最大化的发挥出硬件的极致性能,来应对高负载的业务需求. 为什么需要性能优化? 其实说到底就是两个原因 ...

  4. 文件上传服务器jvm调优,JVM性能调优解决方案(12页)-原创力文档

    精品文档 JVM性能调优解决方案(总结) 一.引言 本文的读者是技术支持人员.阅读本文后,你将理解 jboss 的启动脚本文件 (run.sh )中有一系列的 JVM配置参数的含义,以及如何调整它们, ...

  5. 记一次Java调优,性能提高20倍

    记一次Java调优,性能提高20倍 背景 最近我们接入网关OpenAccess服务增加了流量监控(阿里的Sentinel),进入测试环境,用20个线程并发测试后发现性能问题很严重,响应时间到达了100 ...

  6. JVM调优_硬件层数据一致性_存储器的层次结构

    JVM调优_硬件层数据一致性_存储器的层次结构 存储器的层次结构L0 L1 L2 都是在CPU内部L0:寄存器L1:高速缓存L2:高速缓存L3: 告诉缓存 L4: 主存L5: 磁盘L6:远程文件存储L ...

  7. apache php 调优_LAMP服务器性能优化技巧之加速PHP

    Apache服务器优化.PHP优化.Mysql优化 1.使用eaccelerator 我们上面的介绍Apache服务器的优化,如果您曾经浏览过 PHP 的网页时,或许会发现:怎么 PHP 的速度慢慢的 ...

  8. mlp 参数调优_积神经网络(CNN)的参数优化方法

    积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...

  9. java大量实例化对象如何调优_成都Java性能调优技巧

    成都Java性能调优技巧.大部分建议是针对Java的.但也有若干建议是与语言无关的,可以应用于所有应用程序和编程语言.在讨论专门针对Java的性能调优技巧之前,让我们先来看看通用技巧. 1.在你知道必 ...

最新文章

  1. python什么时候进入中国-Python什么时候开始流行的?还能流行多久?
  2. 通过迭代在DataFrame中取出满足某种条件的列,函数 —— .columns
  3. 调试时碰到的错误syntax error, expect {, actual int, pos 1, json : 3
  4. 安卓手机上微信无法打开Https网址的完美解决方案
  5. PyTorch中“CUDA out of memory”的调试笔记
  6. 给已经做好的GHO文件添加密码
  7. 求1+2+3+...+n(剑指 Offer 64)
  8. 图片 后台 的一些官网 改字体的一些网站
  9. (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
  10. C++程序设计基础(揣锦华版)课后习题答案-第一章:程序设计基础知识
  11. “闽南金三角”——世丰管道福建漳州高级水电工程师会议
  12. MySQL数据库之分库分表方案
  13. spoon链接本地的db2报错
  14. x86架构和arm架构处理器分析
  15. [USACO2.1]Healthy Holsteins 健康的荷斯坦奶牛 题解(DFS/BFS详解)
  16. 传奇手游服务器搭建_传奇手游怎么搭建服务器
  17. Altium Designer 18中的System–Transparency
  18. DC-DC直流升压模块电源12V升24V(5A)FP5207
  19. Q for Mortals2笔记 -- 基本操作
  20. BeQuick软件公司引入SafeNet公司的硬件安全模块(HSM)

热门文章

  1. 消灭星星游戏 MFC
  2. (转)Dundas Chart for .NET
  3. 使用过程中蓝牙驱动突然消失
  4. 公开课精华|机器人的带约束轨迹规划
  5. 中国围棋借应氏杯而涅槃
  6. 信息安全工程师笔记-网站安全需求分析与安全保护工程
  7. java实现qq抢红包_Java实现抢红包算法,附完整代码(公平版和手速版)
  8. 【Arduino】入门篇——烟雾报警器
  9. 关于利用7812和7912单电压转双电压的探讨
  10. 青出于红——《第一行代码(第2版)》