PHP服务端优化全面总结
一.优化PHP原则
1.1PHP代码的优化
(1)升级最新的PHP版本
鸟哥PPT里的对比数据,就是WordPress在PHP5.6执行100次会产生70亿次的CPU指令执行数目,而在PHP7中只需要25亿次,减少64.2%。
参考:PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)
(2)减少include和require的使用
include和require方法中包含了文件读取逻辑,大量使用会造成性能的下降.
解决这个问题可以使用APC加速器组件,缓解此类问题.
(3)使用局部变量代替全局变量
局部变量的速度比全局变量运行的速度要快,使用局部变量可以提高运行效率,同时也易于管理.
(4)使用静态函数和方法
结合实际情况,尽量添加static标签,使用静态函数或者方法,可以有效的提升执行速度.
(5)及时释放无用的变量和资源
PHP自带内存回收机制,但是我们不能过分的依赖,我们要通过unsettle方法,或者直接设置为null的方式来及时的释放无用的变量和资源.
(6)使用单引号代替双引号
单引号和双引号都可以用来包含字符串,但是双引号有字符转义和变量解析的逻辑,所以尽量使用单引号,提升执行效率.
(7)减少
@
屏蔽错误的使用
@
号可以用来屏蔽报错的信息,但是需要注意的是@
会降低脚本的运行速度.
(8)减少PHP中OOP的使用
使用OOP来构建程序框架比较便捷,但是可能会产生额外的系统开销.所以我们要根据实际情况合理的使用OOP思想.
(9)使用抽象类代替接口
PHP中使用接口(interface)的成本比较高,我们应该尽量避免使用,可以使用抽象类(abstract class)来代替.
(10)减少正则表达式的使用
正则表达式的执行成本十分的高昂,尽量使用PHP中自带的字符串处理函数来代替.
(11)压缩需要存储的数据
例如我们保存IP地址的时候可以使用ip2long函数把IP地址转化成整数型数据存储,使用的时候通过long2ip函数还原.
对大数据还可以使用gzcompress和gzuncompress进行压缩和解压.
(12)使用高效的PHP语句
分支语句效率:switch ... case>if ... elseif ... else.
循环语句效率:foreach>for>while.
叠加语句效率:++$i>$i++.
(13)使用高效的PHP函数
字符打印函数效率:echo>print
字符替换函数效率:strtr>str_replace>preg_replace
数组查询函数效率:array_key_exists>isset>in_array
1.2Session机制的优化
(1)在PHP session设置中避免开启auto_start,通常在使用的时候在使用session_start函数开启,减少资源消耗.
(2)合理设置session的有效期,有效期设置过长导致出现负载问题,通常设置在1到8小时之间.
(3)PHP session默认使用文件存储,我们可以通过php.ini中的session_handle选项选择需要的存储方式,常见的有数据库和高速缓存服务Memcache Redis等.
1.3使用缓存中间件
(1)Memcache
(2)Redis
1.4使用APC加速
二.数据库优化
2.1SQL优化
(1)使用慢查询.
在MySQL数据库配置文件my.cnf中加入配置,使用show status like 'Slow%'查看慢查询数量.
分析查询时间大于设置时间的SQL语句,使用explain语句.
(2)使用索引
where:使用确定性的判断添加字段一般加索引
like: 'faf%'使用索引,'%faf%'不能使用索引
少用不确定的判断.如:!=,is not null, not in等.索引非常占据空间,合理创建索引.
(3)使用表关联需要慎重
常用的内连接(inner join)和左连接(left join)每次进行关联查询的时候都会对两张数据表的笛卡尔乘积进行查询,扫描数量大,所以我们尽量使用添加冗余字段避免表关联,使用空间换时间.
如果难以避免使用表关联,那么我们最好给关联的字段建立索引.
不要使用SQL的子查询,效率非常的低.
(4)使用MySQL中查询条件和函数要谨慎
不要使用查询数量的COUNT(*),而是使用COUNT(1).
尽量不要使用DISTINCT.
group by计算十分消耗资源.
max(),min(),substr(),concat(),date_format(),to_days()等都会加大数据库负担.
我们应尽量让数据库负责查询工作,其他使用PHP来做.
2.3数据库架构设计
(1)主从结构
主库负责数据写入,从库负责数据查询,主库写入后快速同步从库.
主从架构既能避免读写造成的锁表问题,又能多台从库分担访问.
但应该注意同步不及时问题.例如,用户修改信息时,主库更新.而从从库获取数据时,从库却没有从主库同步过来.就会造成信息无变化现象.
(2)集群(Cluster)
当主从结构无法满足需求时,我们可以使用集群结构.由众多的主从结构数据库组成集群.
集群架构对分布式逻辑要求比较高,通常是使用唯一的字段作为分布式数据的ID,通过散列分布算法获得数据所在位置,常见的算法有取模算法,一致性散列算法等.
还可以按照数据库名来实现分布式存储数据.这种算法比较简单实用,由于数据库的相关功能不同,每个数据库访问量和数据量也不平均,所以可以按照数据库名来处理.
PHP服务端优化全面总结的更多相关文章
- 【gRPC】C++异步服务端优化版,多服务接口样例
官方的C++异步服务端API样例可读性并不好,理解起来非常的费劲,各种状态机也并不明了,整个运行过程也容易读不懂,因此此处参考网上的博客进行了重写,以求顺利读懂. C++异步服务端实例,详细注释版 g ...
- SSH服务端配置、优化加速、安全防护
CentOS7自带的SSH服务是OpenSSH中的一个独立守护进程SSHD.由于使用telnet在网络中是明文传输所以用其管理服务器是非常不安全的不安全,SSH协议族可以用来对服务器的管理以及在计算机 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
- 服务端spark gbdt模型计算性能优化
服务端使用训练出来的模型,spark模型计算第一步是实现spark模型加载. 线上服务对用户体验影响极大,故需要对模型使用进行优化. 1.多线程并发进行计算,线上两个服务.优化cpu 2.在扩召回集, ...
- Vue(SPA) WebPack模块化打包、SEO优化(Vue SSR服务端同构直出)、全浏览器兼容完整解决方案
白驹过隙,时光荏苒 大概去年这个时候写了angular 结合webpack的一套前端方案,今年此时祭出vue2结合webpack的一套前端方案. 明年的这个时候我又是在做什么... 读在最前面: 1. ...
- 用prerender-spa-plugin插件Vue项目优化SEO做ssr服务端渲染及预渲染
今天在做公交的时候没干,用手机看看文章,偶然发现了一个关于Vue优化seo的文章,我先是在Vue的官方文档看了一篇关于Vue做SEO优化的文章. 上面提到了nuxt.js这个框架,这个框架我做过一个小 ...
- PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案
一:PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案 (1) php服务器把图片处理成缩率图或指定大小的图片在通过PHP程序代码 操作FTP 上传到图片服务器. 二:图片服务器 ...
- 谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
反应式编程在客户端编程当中的应用相当广泛,而当前在服务端中的应用相对被提及较少.本篇将介绍如何在服务端编程中应用响应时编程来改进数据库操作的性能. 开篇就是结论 接续上一篇<谈反应式编程在服务端 ...
- Java服务端性能优化
<Java程序性能优化>说性能优化包含五个层次:设计调优.代码调优.JVM调优.数据库调优.操作系统调优. 常用的几个代码优化方案: 使用单例 对于IO处理.数据库连接.配置文件解析加载等 ...
随机推荐
- Java之路---Day16(泛型)
2019-11-02-23:25:26 目录 1.泛型的概念: 2.泛型的定义和使用: 2.1定义和使用含有泛型的类: 2.2定义和使用含有泛型的方法: 2.3定义和使用含有泛型的接口: 泛型的概念: ...
- JVM底层原理及调优之笔记一
JVM底层原理及调优 1.java虚拟机内存模型(JVM内存模型) 1.堆(-Xms -Xmx -Xmn) java堆,也称为GC堆,是JVM中所管理的内存中最大的一块内存区域,是线程共享的,在JVM ...
- 小鸟初学Shell编程(一)认识Shell
开篇介绍 Linux里非常的有用的一个功能,这个功能就叫Shell脚本. Shell脚本在我日常开发工作里也占了非常重要的角色,项目中一些简单的工作我们都可以使用Shell脚本来完成,比如定时删除日志 ...
- java9模块不可见问题
问题描述 jdk.internal.reflect包不可见 问题原因 java9模块化之后,java.base只把jdk.internal.reflect暴露给了少数几个内部包而没有向当前模块暴露. ...
- MySQL之--修改密码
1.在Mac上安装MySQL会随机生成一个临时密码,如下: --24T02::.004376Z [Note] A temporary password is generated for root@lo ...
- [ElasticSearch]Java API 之 滚动搜索(Scroll API)
一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据).Scroll API允许我们做一个初始阶段搜索并且持 ...
- 简单使用:spring boot整合spring Data JPA
JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.jpa具有什么优势? (1).标准 ...
- odoo10学习笔记十六:定时任务
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189382.html 一:定义定时器数据模型 模型中定义需要用到的字段.定时方法 from odoo im ...
- 虚拟机安装苹果macOS系统
Windows10系统虚拟机vmware15上装macos系统 一.简要步骤: 1.准备软件. 2.关闭VMware服务: 3.解压unlocker,运行文件: 4.启动vmware,选择macOS镜 ...
- 201871010104-陈园园 《面向对象程序设计(java)》第十周学习总结
201871010104-陈园园 <面向对象程序设计(java)>第十周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...