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 的性能。
后续补充 ... |