PHP优化思路
想起来记录一下自己对PHP的优化思路
针对Nginx和 PHP-FPM进行优化
首先应该分为代码层面、配置层面、架构层面
代码层面 参见了https://segmentfault.com/a/1190000009442044 这篇文章
代码层面也可以参考鸟哥的博客:http://www.laruence.com/2011/05/31/2018.html
1.减少PHP代码量
显而易见,PHP作为解释性语言,每次执行都要解析编译到OPCODE,如果代码量越大,需要从PHP代码解析到OPCODE的工作量就越大,这时,可以尝试尽量多的采用系统内置函数。PHP系统对String Array File等操作函数很多,其底层实现为C,自然要比我们写PHP代码要来的快。
2.错误抑制符号 @ 尽量不用,会影响性能
3.少用正则表达式,PHP自带String 相关函数功能很强大,类似strstr() strrchr() strpos() strrpos()等,因为正则表达式会导致过多的回溯,比较占用CPU。
4.避免在循环内做计算
ZendEngine也许不够聪明,循环内每次循环都会做相应的计算。
eg:
<?php $arr = range(1,1000); for($i = 0;$i < count($arr);$i++){//sth}
for($i = 0,$j = count();$i < $j;$i++) {} // ok
// 这会导致每次循环都计算count,因此效率会低一些
5.类内方法,非必需面向对象,定义为Static会提升性能 static耗时:对象函数耗时 1:4
6.误区:require、include等函数在使用带变量的引入其他脚本,会导致性能缺失嘛? 不会,realpath _cache 了解一下
7.switch性能优于if elseif 因为switch在比较的时候,底层会形成类似HashMap的结构,以O(1)的效率找到执行分支,if不会。
8.非必需情况下,少使用全局变量。
9.$i++会比$++i慢一些
https://github.com/xiaoerli520/TestSomeThingInPHP 请看我的库的结论,通过OPCODE可以看出
这边可以看到 ,$i++ 是多了一步 FREE的操作 应该是将临时变量Free掉了
因为$i++是 需要将当前值返回之后再加 因此需要一个临时变量去做返回
++$i是返回增加之后的,过程中无需产生临时变量,也不用去free临时变量,效率较高
10.foreach效率更高
11.少用魔术方法__set() __get()
12 一些方法可以由常量代替
13. 使用include require 而不是 once
include_once (require_once)语句在脚本执行期间包含并运行指定文件。此行为和 include (require)语句类似,区别是如果该文件中的代码已经被包含了,则不会再次包含,只会包含一次。include_once(require_once)需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载。 这样会多一步Hash lookup
计时证明: http://www.php.cn/php-weizijiaocheng-382995.html
配置层面 (自己的认识还比较浅薄)
1. php-fpm 运行模式 https://blog.csdn.net/baidu_21154279/article/details/54929664
如果内存大,使用静态模式,pm.workers数量为 内存大小 / 30M 避免线程开闭导致的开销
如果内存小,使用动态模式 pm workers 数量为 内存大小 / 20M
动态模式能更好的规避内存泄露相关问题,例如exec执行某些指令失败,可以考虑重启FPM(USR2)
2.php OPCACHE
使用Opcache扩展能更好的提升性能,其默认缓存最小粒度当然是脚本文件,缓存根据是脚本的mtime ,因此注意rsync带来的坑,默认缓存文件个数为 2k, 默认缓存时间1s 后自动检查更新。
3.php realpath cache
使用realpath cache能更好的令PHP进行require include等操作。
4.php-fpm 与 nginx的沟通模式
默认使用TCP socket进行沟通,如果PHP和nginx是1:1的关系,那么不妨使用Unix socket ,这样能减少TCP协议相关压力,避免回环,提升性能,但是可能稳定性会稍微降低一些。
5.数据库presistent持久链接配置启动,可以实现长连接,提升性能。
架构层面
1. 使用Cache,类似Memcache,Redis等,减少数据库压力(注意缓存穿透时的回原压力)
2. 使用MQ进行削峰,异步调度总能性能更加
3.接入层负载均衡,可以根据不同的配置,分发不同的权重等
4.DB读写分离
PHP优化思路的更多相关文章
- mysql优化思路
/* mysql优化思路 1.数据库设计 2.sql语句优化 3.数据库参数设置 4.恰当的硬件资源和操作系统 数据库设计 数据的3NF( ...
- redis在实践中的一些常见问题以及优化思路
1.fork耗时导致高并发请求延时 RDB和AOF的时候,其实会有生成RDB快照,AOF rewrite,耗费磁盘IO的过程,主进程fork子进程 fork的时候,子进程是需要拷贝父进程的空间内存页表 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
- Spring配置表友好性优化思路
Spring配置表需要尽量保证对程序员的友好性,一下提供一种优化思路. 中途未保存,心态炸了,只贴图了,fuuuuuuuuuuuuuck 第一种(最烂,最不友好):以Json的格式保存在配置表中,程序 ...
- 转:使用RNN解决NLP中序列标注问题的通用优化思路
http://blog.csdn.net/malefactor/article/details/50725480 /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author ...
- 【58沈剑架构系列】mysql并行复制优化思路
一.缘起 mysql主从复制,读写分离是互联网用的非常多的mysql架构,主从复制最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重. 为什么mysql主从延时这么大? 回答:从 ...
- MySQL order by的一个优化思路
最近遇到一条SQL线上执行超过5s,这显然无法忍受了,必须要优化了. 首先看眼库表结构和SQL语句. CREATE TABLE `xxxxx` ( `id` ) NOT NULL AUTO_INCRE ...
- spark(二)优化思路
优化思路 内存优化 内存优化大概分为三个方向 1.所有对象的总内存(包括数据和java对象) 2.访问这些对象的开销 3.垃圾回收的开销 其中Java的原生对象往往都能被很快的访问,但是会多占据2-5 ...
- Nginx优化思路
对于高性能网站 ,请求量大,如何支撑? 1方面,要减少请求 对于开发人员----合并css, 背景图片, 减少mysql查询等. 2: 对于运维 nginx的expires ,利用浏览器缓存等,减少查 ...
随机推荐
- [转]自然语言处理中的Attention Model:是什么及为什么
自然语言处理中的Attention Model:是什么及为什么 https://blog.csdn.net/malefactor/article/details/50550211 /* 版权声明:可以 ...
- poj 1236 强联通分量
大致题意给你有一个点数为n<=100的有向图. 求解两个子任务: 1:最少给多少个点信息,这些点的信息可以顺着有向边传遍全图. 2:最少要加多少条边,使得整个图强联通. 求强联通分量再缩点后得到 ...
- Python中的基本语法
#Python的基本语法: #1.了解缩进 #Python中没有{}来表示一个代码块,但是Python使用缩进来完成区别代码框架 #那么在Python中一个缩进一般等于4个空格,当然你也可以使用TAB ...
- Python根据路径名称获取文件的名称以及所在的路径
大神一看题目就知道用python中的string.split('\'),记得之前处理大量的文件的时候,有时候有几十万的文本文件,经常会读取获取名称,并且保存为名字一样的另外一种格式的文件 其实pyth ...
- kali的安装
https://www.youtube.com/watch?v=sB3bchzlwio 注意视频中选择的是kali 2016.2版本, 在VMware中选择了Linux-Debian 8.*64(好像 ...
- 如何在git上创建的本地仓库
一.安装git(在git) 二. 三.输入个人信息(代码提交者) git config --global user.name "xxxx" git config --global ...
- 给Linux服务器设置共享文件目录
通过samba软件 :yum install samba 修改配置文件:vi /etc/samba/smb.conf 添加 [WORKSPACE] comment = workspace ...
- easyui表单校验
痛苦使人清醒,痛苦使人警惕.生于忧患,死于安乐.付出总会有回报. 1.下面跟大家分享使用easyui时表单中的值如何校验. 1.1 首先,在你的jsp/html页面引入JQuery和easyui的js ...
- python------Json与pickle数据序列化
一.json序列化 xml在被json取代,不同平台之间的语言转换,只能处理简单的.复杂的用pickle: pickle只能在python中用,而在Java中json也可以被识别. info = { ...
- Eclipse和Intel idea的常用技巧
使用Eclipse的几个必须掌握的快捷方式 “工若善其事,必先利其器”,感谢Eclipse,她 使我们阅读一个大工程的代码更加容易,在阅读的过程中,我发现掌握几个Eclipse的快捷键会使阅读体验 ...