经常有人说php速度慢,其实语言层面的速度差异和实际的业务相比,不在一个数量级。

业务的瓶颈往往在于io,而不是CPU。

0x0 语言

语法

  1. 单引号和双引号 单引号不解析字符串里的变量,而双引号会解析,如果需要大量处理字符串,建议用单引号和字符串连接符"."
  2. === 和 == ""会进行类型转换,比如"1"和1 ,用""为真,而"="为假,如果类型相同的话,使用""。
  3. 合理使用静态变量,如保存函数中只需要初始化一次的数据
  4. 局部变量优于全局变量
  5. 输出缓存控制 ob_xxx系列函数
  6. php7 针对项目单独优化 可参看鸟哥的文章
  7. 使用php7 增加变量的参数类型,减少类型转换
  8. 合理使用多线程和协程
  9. 更多语法上的优化可以看这篇文章

php.ini配置

网上有很多,可以参加这篇文章

第三方服务

利用第三方服务,可以把php不擅长的委托出去

  • gearman 分布式任务队列,教程
  • beanstalk 消息队列,教程
  • redis 缓存

    消息队列和任务队列,常用在比较耗时的任务,比如批量导出订单数据为excel时,web服务直接可以把这个消息

    放到消息队列里,在后台跑一个脚本,取出消息后,查询数据库导出订单。至于后台使用什么语言,则无所谓了。

    这两个队列有些相似之处,基本上使用消息队列就足够了。任务队列在编码上要稍微复杂点,要按照任务协议,实现worker。

    消息队列只需要subscribe这个队列,有消息来了,取出消息,然后处理就行。

框架

可以选择简洁的框架,减少框架内部的消耗,如slim,phalocn,yaf

字节码缓存

opcache、apc等

扩展

使用扩展,如把cpu密集型的改用C/C++开发扩展,可以使用PHP-CPP,或者PHP-X

辅助开发。

0x1环境

  • Nginx 优化,参考这篇文章

  • Apache 优化, 参考这篇文章

  • Linux系统优化,参考这篇文章

  • 使用负载均衡,部署多台服务器

0x2 算法

  • 递归算法改为非递归
  • 先排序再查找
  • 用哈希代替数组,如判断某个字符串在数组里是否存在,可以把数组改造为哈希,这样只需要判断哈希里key是否存在即可
  • 使用php内置的array_xxx,系列函数,搭配回调函数,解决数组过滤、查询、去重等
  • 利用redis的集合,如判断两组数据中重复的数据,求两组数据中的差异

0x3 业务

通过跑测试来判断瓶颈所在,再分别优化

io密集型

增大内存

  • 文件io

    memcache 缓存文件、异步读取
  • 网络io
    • 压缩 之前做游戏时,内网测试单台机器可以支撑1000多人同时在线,然而正式环境才只能支撑200多人。

      测试同学反馈是网络带宽不够,于是在服务端和客户端都做了gzip压缩,数据量减少到1/6,解决了外网问题。
    • 尝试更紧凑的结构如,xml替换为json,json替换为msgpack等
  • 数据库io
    • 分库
    • 分表
    • 分区
    • 索引
    • 读写分离
    • 缓存
    • 代理 如360的Atlas,golang开发的kingshard
  • 使用缓存
    • 浏览器 在http头中添加etag和cache控制缓存时间
    • cdn
    • redis
    • 服务端渲染

cpu密集型

把相关代码用C/C++改写为扩展

安装监控软件

如oneapm,听云、博瑞等,或者开源的Tideways

PHP优化——从语言到业务的更多相关文章

  1. CockroachDB学习笔记——[译]如何优化Go语言中的垃圾回收

    原文链接:https://www.cockroachlabs.com/blog/how-to-optimize-garbage-collection-in-go/ 原作者:Jessica Edward ...

  2. 【数据库】优化SQL语言

    第1章数据模型设计 第1条:确保所有表都有主键 [1]当表缺少主键时,会出现各种问题,所有表都必须有一列(或多列)设置为主键. [2]主键应当具备的特征 唯一性,值非空,不可变,尽可能简单 [3]不要 ...

  3. 如何优化C语言代码(程序员必读)

    1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...

  4. 每秒100W请求,12306秒杀业务,架构如何优化?

    如<同样是高并发,QQ/微博/12306的架构难度一样吗?>一文所述,同样是高并发场景,三类业务的架构挑战不一样: QQ类业务,用户主要读写自己的数据,访问基本带有uid属性,数据访问锁冲 ...

  5. iOS app性能优化的那些事

     iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...

  6. app 性能优化的那些事

    来源:树下的老男孩 链接:http://www.jianshu.com/p/5cf9ac335aec iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功 ...

  7. 简单说说PHP优化那些事

    我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行速度与最 ...

  8. 细说PHP优化那些事

    我们在用PHP编程的时候,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行 ...

  9. 第 8 章 MySQL 数据库 Query 的优化

      前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...

随机推荐

  1. UVA 624 CD[【01背包】(输出路径)

    <题目链接> 题目大意: 你要录制时间为N的带子,给你一张CD的不同时长的轨道,求总和不大于N的录制顺序 解题分析: 01背包问题,需要注意的是如何将路径输出. 由于dp时是会不断的将前面 ...

  2. vue中的dom指令控制

    一.条件控制指令1.v-if,条件渲染 <div id="J_app"> <p v-if="show">显示该标签</p> ...

  3. {}+[]与console.log({}+[])结果不同?从JavaScript的大括号谈起

    看到这样一个问题:为什么直接在控制台运行{} + []和用console.log({} + [])输出,两者结果不一样? 于是乎打开chrome的控制台运行了一下: 为什么结果会这样呢?不得已学习一下 ...

  4. C# 使用PrintDocument 绘制表格 完成 打印预览 DataTable

    经过不断的Google与baidu,最终整理出来的打印类 主要是根据两个参考的类组合而成,稍微修改了一下,参考代码及来源见最后(其中一份是VB语言的) 其中遇到的一些问题也已经得到了解决(分页,打印预 ...

  5. BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)

    题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ...

  6. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

  7. Python 爬取bangumi网页信息

    1.数据库连接池 #######db.py########## import time import pymysql import threading from DBUtils.PooledDB im ...

  8. C#高级编程9 第17章 使用VS2013-C#特性

    C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...

  9. 9、SQL逻辑查询语句执行顺序

    本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...

  10. MX4_ADB

    一.Ubuntu环境1. 建立或修改文件 ~/.android/adb_usb.ini,在文件开头或末尾添加一行,内容是0x2a45. 2. 建立或修改文件 /etc/udev/rules.d/51- ...