【性能优化】PHP - 优化手段 - 学习/实践

1.应用场景

主要用于从多个层面多种手段去优化PHP程序性能,或者移植性,阅读星,维护性。

2.学习/操作

PHP 的图像结果

1.文档阅读

性能优化 = 改改代码?- 学习/实践_穿素白衫的少年的博客-CSDN博客

https://www.jb51.net/article/30740.htm

通过Twemproxy提升PHP/Redis的性能 | 火丁笔记

为高性能优化 PHP-FPM | PHP优质外文翻译 | PHP 技术论坛

鸟哥的建议 -- 需要实践

让PHP7达到最高性能的几个Tips - 风雪之隅

让你的PHP7更快(GCC PGO) - 风雪之隅

让你的PHP7更快之Hugepage - 风雪之隅

word-press的性能优化--blog

Page Speed and Caching for WordPress: Our Tutorials

2.整理输出

程序的最终性能表现「需要结合具体的性能指标来看」是由多种因素共同作用下的结果。

也就意味着,性能优化需要从多个方面入手,有多种手段方式。

通常服务/软件的性能优化,可以从多个方面/层面去做:「PHP自然在其中」

推荐从低到高的维度去分析,然后有的放矢,针对性做优化。

底层: 底层源码入手,做优化,编译安装,包括增加一些扩展通过重新编译安装的方式,从根上分析,优化 -- 难度比较大,要求能力比较高,所以这种方式,通常会由软件/服务「编程语言」的核心开发者团队来提供,比如:PHP的opcache扩展,就直接集成到PHP源码中。「但是我们要知道,如果你的技术能力很强,也自然可以」

中层:软件/服务安装之后,开启一些配置,简单来说,就是优化执行环境。

比如: 修改配置文件,开启一些特性「PHP开启使用opcache,根据自身的环境「硬件和软件」,合理配置参数」

高层:通常是应用层代码开发层面。 比如:使用高效的PHP函数,目前最佳实践的设计模式,开发技巧,优化业务逻辑,降低时空复杂度,简单说,就是最大程度地利用硬件资源。

但是,到了高层,不单单要考虑代码的性能,还要考虑易维护性等方面因素,要有所取舍。

但是请留意,上面的层级之间是相对而言,而且是结合具体上下文来定的,所以不是一层不变的,分层可以灵活,比如认为只有底层和高层。

而且,这些层级之间,必然是有联系,因为上层依赖下层,下层支持上层。

2.1 底层「优化底层代码,如:增加扩展形式」

让PHP7达到最高性能的几个Tips - 风雪之隅

1. Opcache

https://blog.csdn.net/william_n/article/details/127622844

2. 使用新的编译器

3. HugePage

让你的PHP7更快之Hugepage - 风雪之隅

4. Opcache file cache

5. PGO

让你的PHP7更快(GCC PGO) - 风雪之隅

2.2 中层「配置参数优化」

TBD

2.3 高层「应用层的代码开发」

1). 合理使用unset函数[并不是使用unset()就一定会释放内存]

这就涉及到底层的内存垃圾回收机制,所以,做高层优化,离不开底层实现,建议要先回顾底层,然后去实践,测试验证。

$data = array_values($data);
// 数据处理【将数据按照[rule]进行降序排列】
$data = array_map(function ($v) {
    $v['rule_count'] = count($v['rule']);
    return $v;
}
, $data);
$newData = [];
foreach ($data as $key => $value) {
    $newData[$key] = $value['rule_count'];
}
arsort($newData) $tmp = [];
foreach ($newData as $newKey => $newValue) {
    $tmp[] = $data[$newKey];
}
$data = $tmp;
$mm = memory_get_usage(); //获取占用的内存 
var_dump($mm); 
unset($newData); 
unset($tmp); 
mm = memory_get_usage(); 
var_dump($mm); 
exit;

打印结果:

int(7047216)

int(7025672)

说明: 内存有释放

2). 各种小tips收集 「这里就直接汇总了」

PHP代码优化的目的是为了提高PHP程序的执行效率,编写PHP代码时,可以从以下方面着手优化:

1. 用单引号代替双引号来包含字符串「但是当有变量拼接时,可以适当考虑使用双引号,为了更好的代码可读性」


2. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍
3. 用 echo 代替 print,效率更好
4. 及时注销不用的变量,尤其是大数组,以便释放内存
5. 尽量避免使用__get(),__set(),__autoload()
6. require_once()代价昂贵,尽量少用
7. 尽量用函数代替正则表达式完成相同的功能
8. str_replace 函数比 preg_replace 函数快
9. 使用分支语句(即 switch case)好于使用多个 if,else if 语句
10. 用@屏蔽错误消息的做法非常低效
11. 当执行变量$i的递增或递减时,++$i 会比 $i++ 快一些
12. 尽量使用PHP的内置函数
13. 循环体内部不要声明变量,尤其是大变量
14. foreach 效率更高,尽量用 foreach 代替 while 和 for 循环
15. 用 $i+=1 代替 $i=$i+1,效率更高 
16. 对于 global 全局变量,用完后立即 unset() 掉 
17. 适当地做一些缓存处理

2.3 换行使用 PHP_EOL 来替代,以提高代码的源代码级可移植性

或者使用 \r\n

unix系列用 \n
windows系列用 \r\n
mac用 \r

<?php


echo PHP_EOL;


// windows平台相当于   echo "\r\n";
// unix\linux平台相当于   echo "\n";
// mac平台相当于    echo "\r";

2.4 变量普通赋值与引用赋值,参数传值与传引用

PHP - 变量赋值和引用以及参数传值与传引用的区别 - 学习/实践_穿素白衫的少年的博客-CSDN博客

2.5 通过Twemproxy提升PHP/Redis的性能 -- 这里的技术实现方案是作为参考

主要是为了说明,Pipelining技术可以借鉴,当代理收到多个并发请求时,它会把这些请求打包成一个请求发送给后端服务器,从而减少不必要的 RTT。

通过Twemproxy提升PHP/Redis的性能 | 火丁笔记

Twemproxy 可以说是最古老的 Redis 代理软件了,一般来说,引入代理后性能会比没有引入代理时低一些,毕竟代理会导致一些额外的性能损耗,可是 Twemproxy 却会提升性能, 这主要得益于它的 Pipelining 功能可以实现打包请求,简单点说:当代理收到多个并发请求时,它会把这些请求打包成一个请求发送给后端服务器,从而减少不必要的 RTT。关于 Pipelining 本文不做过多讨论,实际上我想说的是它的另一个功能:连接池!下面看看如何通过 Twemproxy 提升 PHP/Redis 的性能。

后续补充

...

3.问题/补充

TBD

4.参考

参见上面文档列表

后续补充

...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值