PHP性能优化 -理论篇
什么情况下,遇到了PHP性能问题?
1 PHP语法使用的不恰当
2 使用PHP语言做不了它不擅长做的事
3 用php语言连接的服务不给力
4 PHP自身的短板
5 我也不知道的问题
性能问题解析
PHP的性能问题,占整个项目性能问题的比例 不到50%
性能优化项目,不要局限于仅优化PHP
php语言级的性能优化
|
|
|
php周边问题的性能优化
|
|
|
php语言自身分析,优化
PHP 压力测试工具ab简介
Apache Benchmark(ab)(可以自行下载)
ab是由Apache提供的压力测试软件,安装apache服务器时会自带该压测软件。
如何使用?
./ab -n1000 -c100 http://www.baidu.com/
-n请求数
-c并发数
url目标压测地址
PHP-压力测试工具使用演示
主要关注 每秒并发尽可能的多
请求耗时尽可能的少
多使用PHP自身能力
优化:少写代码,多用PHP自身能力
性能问题: 自身代码冗余较多,可读性不佳,并且性能低
为甚性能低?
PHP代码需要编译解析为底层语言,这一过程每次请求都会处理一遍,开销大。
好的方法:
多使用PHP内置变量\常量\函数
PHP自身能力性能测试之代码准备
php代码运行流程
*.php ---Scanner---> Exprs -----Parser--->Opcodes---Exec--->Output
php内置函数之间的性能测试
优化点:php内置函数的性能优劣
情况描述: php内置函数,之间依然存在块慢差异
好的建议: 多去了解PHP内置函数的时间复杂度
php内置函数之间的性能测试之代码测试
isset($arr[$i]); //平均50ms
array_key_exists($i,$arr);//平均85ms
减少PHP魔法函数的使用
情况描述: PHP提供的魔法函数,性能不佳
为什么性能低 为了给PHP程序猿省事 PHP语言为你做了很多
好的方法 尽可能规避使用PHP魔法函数
PHP 禁用错误抑制符
@的实际逻辑
在代码开始前 结束后 增加 Opcode 忽略报错
php -dv|d.active=1 -dv|d.execute=0 at.php
只是想查看并不是真的想执行
PHP-合理的使用内存和正则表达式
优化点:合理使用内存
PHP有内存回收机制保底,但也请小心使用内存
好的建议
利用unset() 及时释放不使用的内存(注:unset()出现注销不掉的情况)
尽量少的使用正则表达式
正则表达式的回溯开销较大,
好的建议:
利用字符串处理函数,实现相同逻辑
PHP-避免在循环内做运算
优化点:避免在循环内做运算
情况描述:
循环内的计算式将会被重复计算
代码示例:
<?php
$str = "hello world";
for($i=0;$i<strlen($str);$i++)
{
//do something
}
PHP-减少计算密集型业务
PHP不适合密集型运算的场景
PHP语言特性决定了PHP不适合做大数据量运算
PHP适合场景
适合衔接Webserver与后盾服务,UI呈现
PHP-务必使用带引号字符串做键值
PHP会将没有引号的键值当做常量,产生查找常量的开销
严格使用引号的字符串作为键值
PHP周边问题的分析与阐述
PHP周边都有什么?
linux运行环境 php 硬盘(文件存储) 数据库(例如mysql) 缓存 网络
php周边对PHP程序的影响分析
减少文件类的操作
常见PHP场景的开销次序:
读写磁盘 读写数据库 读写内存 读写网络数据
读写内存 << 读写数据库 < 读写磁盘 < 读写网络数据
减少PHP发起网络请求
网络请求的坑:
1 对方接口的不确定因素
2 网络稳定性
优化网络请求
1 设置超时时间
连接超时 200ms
读超时 800ms
写超时 500ms
2 将串行请求并行化
1 curl_multi_*()
2 使用swoole扩展
curl_multi_*()不是很好,因为他是按最长的一个返回的时间来定的
curl_multi_add_handle 向curl批处理会话中添加单独的curl句柄
curl_multi_close 关闭一组cURL句柄
curl_multi_exec 运行当前cURL句柄的子连接
curl_multi_getcontent 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_info_read 获取当前解析的cURL的相关传输信息
curl_multi_remove_handle 移除curl批量处理句柄资源中的某个句柄资源
curl_multi_select 等待所有cURL批处理中的活动连接
curl_multi_setopt Set an option for the cURL multi handle
curl_multi_strerror - Return string describing error code
推荐swoole扩展来做
压缩PHP输出的利与弊
压缩php接口的输出
如何压缩?
使用Gzip即可
利 利于我们的数据输出,Client端能更快获取数据
弊 额外的CPU开销
PHP缓存复用
什么情况下做输出内容的缓存?
多次请求,内容不变情况
Smarty调优和重叠时间窗口思想
Smarty开启 caching
重叠时间窗口思想
串行:
Process1 Process2 Process3 Process4
重叠时间窗口:
process1
process2
process3
process4
后一个任务不强依赖前一个任务的时候,可以使用重叠时间
PHP旁路处理方案
一般普通的:x.php -> Process1 ->process2 ->process3 -> process4->
旁路方案: x.php -> Process1 ->process2(同时) ->Process3 (同时) -->Process4->
PHP性能优化 -理论篇的更多相关文章
- 前端性能优化JavaScript篇
关于前端性能优化的讨论一直都很多,包罗的知识也很多,可以说性能优化只有更好,没有最好.前面我写了一篇关于css优化的总结文章,今天再从javascript方面聊一聊. 1.从资源加载方面来说,浏览器的 ...
- (转)Android性能优化——工具篇
Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...
- MySql学习(五) —— 数据库优化理论篇(一)
一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...
- Mysql优化系列之查询性能优化前篇2
接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...
- android 性能优化-电量篇
消耗电量的几个主要原因.功能:1.大数据量的网络传输(网络)2.不停的网络切换(网络)3.解析大量的数据(CPU) 关于网络方面的优化: .网络请求之前,检查网络连接.没有网络连接不进行请求 .判断网 ...
- Android 性能优化——内存篇
一.android官方一些内存方面的内存tips 1.避免创建不必要的对象. 如尽量避免字符串的加号拼接,可以使用StringBuilder来拼接. 如果需要TextView设置多个字符串片段,可以使 ...
- PHP性能优化 -实战篇
借助xhprof 工具分析PHP性能 XHPorf(源自Fackbook 的PHP性能分析工具) 实战 通过分析Wordpress程序,做优化! 优化 找到需要优化的函数 grep 'impo ...
- 现代浏览器性能优化-CSS篇
我来填坑了,CSS篇终于写出来了,如果你没看过前面的JS篇,可以在这里观看. 众所周知,CSS的加载会阻塞浏览器渲染或是引起浏览器重绘,目前业界普遍推荐把CSS放到<head>中,防止在C ...
- Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)
事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...
随机推荐
- Gradle Goodness: Display Available Tasks
To see which tasks are available for our build we can run Gradle with the command-line option -t or ...
- import 本质
一. 模块:用来从逻辑上来组织python代码(变量,函数,类,逻辑,实现一个功能),本质就是,py结尾的python文件 1.1 导入方法: import module import module1 ...
- DDL-数据类型
一.数值型1.整型tinyint.smallint.mediumint.int/integer.bigint1 2 3 4 8 特 ...
- The number of sections contained in the collection view after the update (1) must be equal to the number of sections contained in the collection view before the update (0), plus or minus the number of
现象:当删除CollectionView 当中的某个section的时候,报上面的错误 初步分析:当前CollectionView删除前后都不止一个Section,怎么会报那样的错误:猜想可能是相册界 ...
- T-SQL查询:WITH AS 递归计算某部门的所有上级机构或下级机构
drop table #Area; CREATE TABLE #Area ( id INT NOT NULL, city_name NVARCHAR(100) NOT NULL, parent_id ...
- 洛谷P1501 [国家集训队]Tree II(LCT)
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...
- IntelliJ IDEA(2018)安装和破解。
一.下载并安装, IntelliJ IDEA的官网:https://www.jetbrains.com 二.破解. 百度下载一个 JetbrainsCrack-2.6.2.jar ...
- 一图看懂JVM,JRE,JDK的关系
- 每天一个Linux命令之mkdir
Linux mkdir命令 mkdir [-p] filename 用于创建一个空目录 如果该目录下有相同名称的目录那么会报错 apple@apple-Pro ~/Documents/java_d ...
- Go 学习之路:Println 与 Printf 的区别
Println 和Printf 都是fmt包中公共方法:在需要打印信息时常用的函数,那么二函数有什么区别呢? 附上代码 package main import ("time"&qu ...