PHP优化——从语言到业务
经常有人说php速度慢,其实语言层面的速度差异和实际的业务相比,不在一个数量级。
业务的瓶颈往往在于io,而不是CPU。
0x0 语言
语法
- 单引号和双引号 单引号不解析字符串里的变量,而双引号会解析,如果需要大量处理字符串,建议用单引号和字符串连接符"."
- === 和 == ""会进行类型转换,比如"1"和1 ,用""为真,而"="为假,如果类型相同的话,使用""。
- 合理使用静态变量,如保存函数中只需要初始化一次的数据
- 局部变量优于全局变量
- 输出缓存控制 ob_xxx系列函数
- php7 针对项目单独优化 可参看鸟哥的文章
- 使用php7 增加变量的参数类型,减少类型转换
- 合理使用多线程和协程
- 更多语法上的优化可以看这篇文章
php.ini配置
网上有很多,可以参加这篇文章
第三方服务
利用第三方服务,可以把php不擅长的委托出去
- gearman 分布式任务队列,教程
- beanstalk 消息队列,教程
- redis 缓存
消息队列和任务队列,常用在比较耗时的任务,比如批量导出订单数据为excel时,web服务直接可以把这个消息
放到消息队列里,在后台跑一个脚本,取出消息后,查询数据库导出订单。至于后台使用什么语言,则无所谓了。
这两个队列有些相似之处,基本上使用消息队列就足够了。任务队列在编码上要稍微复杂点,要按照任务协议,实现worker。
消息队列只需要subscribe这个队列,有消息来了,取出消息,然后处理就行。
框架
可以选择简洁的框架,减少框架内部的消耗,如slim,phalocn,yaf
字节码缓存
opcache、apc等
扩展
使用扩展,如把cpu密集型的改用C/C++开发扩展,可以使用PHP-CPP,或者PHP-X
辅助开发。
0x1环境
0x2 算法
- 递归算法改为非递归
- 先排序再查找
- 用哈希代替数组,如判断某个字符串在数组里是否存在,可以把数组改造为哈希,这样只需要判断哈希里key是否存在即可
- 使用php内置的array_xxx,系列函数,搭配回调函数,解决数组过滤、查询、去重等
- 利用redis的集合,如判断两组数据中重复的数据,求两组数据中的差异
0x3 业务
通过跑测试来判断瓶颈所在,再分别优化
io密集型
增大内存
- 文件io
memcache 缓存文件、异步读取 - 网络io
- 压缩 之前做游戏时,内网测试单台机器可以支撑1000多人同时在线,然而正式环境才只能支撑200多人。
测试同学反馈是网络带宽不够,于是在服务端和客户端都做了gzip压缩,数据量减少到1/6,解决了外网问题。 - 尝试更紧凑的结构如,xml替换为json,json替换为msgpack等
- 压缩 之前做游戏时,内网测试单台机器可以支撑1000多人同时在线,然而正式环境才只能支撑200多人。
- 数据库io
- 使用缓存
- 浏览器 在http头中添加etag和cache控制缓存时间
- cdn
- redis
- 服务端渲染
cpu密集型
把相关代码用C/C++改写为扩展
安装监控软件
如oneapm,听云、博瑞等,或者开源的Tideways
PHP优化——从语言到业务的更多相关文章
- CockroachDB学习笔记——[译]如何优化Go语言中的垃圾回收
原文链接:https://www.cockroachlabs.com/blog/how-to-optimize-garbage-collection-in-go/ 原作者:Jessica Edward ...
- 【数据库】优化SQL语言
第1章数据模型设计 第1条:确保所有表都有主键 [1]当表缺少主键时,会出现各种问题,所有表都必须有一列(或多列)设置为主键. [2]主键应当具备的特征 唯一性,值非空,不可变,尽可能简单 [3]不要 ...
- 如何优化C语言代码(程序员必读)
1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...
- 每秒100W请求,12306秒杀业务,架构如何优化?
如<同样是高并发,QQ/微博/12306的架构难度一样吗?>一文所述,同样是高并发场景,三类业务的架构挑战不一样: QQ类业务,用户主要读写自己的数据,访问基本带有uid属性,数据访问锁冲 ...
- iOS app性能优化的那些事
iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...
- app 性能优化的那些事
来源:树下的老男孩 链接:http://www.jianshu.com/p/5cf9ac335aec iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功 ...
- 简单说说PHP优化那些事
我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行速度与最 ...
- 细说PHP优化那些事
我们在用PHP编程的时候,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行 ...
- 第 8 章 MySQL 数据库 Query 的优化
前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...
随机推荐
- Linux学习之文件属性chattr权限与sudo权限(十二)
Linux学习之文件属性chattr权限与sudo权限 文件属性chattr Linux文件的隐藏属性在保护系统文件的安全性上非常重要,是防止误操作的,对root用户也同样有效.chattr命令只能在 ...
- Linux学习之常用文件处理命令(一)
(一)文件命名规则 (二)常用文件处理命令 1.ls命令 2.cd命令 3.pwd命令 4.mkdir命令 5.touch命令 6.cp命令 7.mv命令 8.rm命令 9.cat命令 10.more ...
- 浅谈vue之动态路由匹配
在日常开发过程中,可能会遇到一些类似于新闻详情页的内容,需要把所有详情页映射到同一组件上,这是动态路由匹配的应用场景之一.在使用的过程中,也遇到过一些小坑,此篇做个简要的总结说明: 基本使用 { pa ...
- Java中递归和循环的优劣
介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...
- 算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
第二课主要介绍第一课余下的BFPRT算法和第二课部分内容 1.BFPRT算法详解与应用 找到第K小或者第K大的数. 普通做法:先通过堆排序然后取,是n*logn的代价. // O(N*logK) pu ...
- BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)
题目链接 \(Description\) 给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1. \(Solution\) 假设我们现在有suf(SA[j]),要构造suf( ...
- [POI2011]Śmieci
[POI2011]Śmieci 题目大意: 一个\(n(n\le10^5)\)个点\(m(m\le10^6)\)条边的无向图,每条边有边权\(0/1\),试找出若干个环,使得每次翻转环上所有边的权值, ...
- 20172302《程序设计与数据结构》实验三 敏捷开发与XP实践报告
课程:<程序设计与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年5月16日 必修/选修: 必修 1.实验内容 (1)代码规 ...
- C++学习笔记40:进程应用
进程创建 system()函数:用于在程序中执行一条命令 如果shell不能运行,返回127,如果发生其他错误返回-1: 例子:int ret_val = system(“ls -l /”); for ...
- Unity脚本-Rotate旋转相关知识点
1,Transform旋转 transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0); tr ...