PHP的性能优化方法总结

news2024/11/24 12:02:29

一.什么情况之下,会遇到PHP性能问题?

  • PHP语法使用不恰当
  • 使用PHP语言做了它不擅长的事情
  • 使用PHP语言连接的服务不给力
  • PHP自身的短板(PHP自身做不了的事情)
  • 我们也不知道的问题?(去探索、分析找到解决办法,提升开发境界)

二.压力测试注意事项

对线上站点做压力测试的时候,一定要将请求数并发数,特别是并发数要设置的比较低,不能对线上的网站造成压力问题,不管是自己的还是别人的

PHP性能问题一般不会超过占整个项目性能的50%,一般在30%~40%

三.PHP性能问题的解决方向,三个层级

PHP语言级的性能优化,指的是PHP语法基本功能,这部分优化比较简单易见、快速可行,比较快速看到效果

 1.少写PHP的代码,多用PHP自身能力解决问题

性能问题:

      自写代码冗余较多,可读性不佳,并且性能低,如代码很长很长...PHP代码越长PHP的执行效率越慢

为什么性能低?

PHP代码需要解析编译为C语言,底层C语言又要编译成汇编语言机器语言才能执行,这个过程在每次请求过来之后都要处理一遍,所以开销很大(项目变大的话...)

解决方法

多使用PHP内置的变量、常量、函数,用PHP代码实现的功能和使用PHP内置的函数实现的同样功能差别是有的

 2.PHP内置函数的性能优劣

PHP内置函数之间依然存在快慢差别;少用PHP魔术方法;

 建议

多去了解PHP内置函数的执行实现复杂度

测试方法

比较效率测试,如用microtime()函数,取差值,精确到毫秒级别;Linux的time命令可以查看开销

 3.产生额外开销的错误抑制符号“@”,最好别用(不管是性能优化和项目的健壮性等方面)

 @的逻辑是在代码前和代码结束后增加了Opcode,Opcode的作用就是忽略报错,其实就是相当于增加了error_reporting设置,等级报错为忽略(vld扩展可以查看被隐藏的Opcode)

4.合理使用内存

 PHP有内存回收机制保底,但是也小心使用内存

建议

利用unset()及时释放不使用的内存,比如一些数据库多余字段(注意:unset()有时会出现注销不掉的情况) 

5.尽量少用正则表达式

正则表达式的开销大,使用起来简单,但是性能低因为,正则表达式需要回溯;正则表达式越长,回溯的开销越大,优化正则表达式是需要技术水平的,正则技术不达标,不要乱用正则

6.避免在循环内做运算

循环内的计算式将被重复计算(我们在for循环或者while循环,会有重复计算,影响性能问题)

举例

//错误用法:

$str = "hello world";
for($i = 0; $i < strlen($str); $i ++){ ...}

//正确用法:
$str = "hello world";
$strlen = strlen($str);
for($i = 0; $i < $strlen; $i++){...}

 7.减少计算密集型业务

PHP不适合密集型(大数据量)运算的场景

原因

PHP的语言特性决定PHP不适合做大数据量运算,PHP语言由C写的,PHP处于C基础之上,PHP的所有运算处理流程需要转化为C语言,PHP和C想比性能肯定输了,并且PHP语言还有一些环境问题、语言特性,相比于C而言的开销要大很多的。PHP一段很长的代码,可能C很短就实现了...

PHP适合场景

适合衔接WebServer与后端服务,WebServer来了请求交给PHP,PHP做一些校验、一些初始化数据处理,将请求转发交给后端,等待后台响应,后端可能是缓存、DB等其他业务,后端响应之后,PHP再作为纽带,将信息传递给WebServer,这是PHP擅长的。PHP也擅长做UI呈现,也就是配合模板引擎做模板输出,其实就是一些字符串文本处理

8.务必使用带引号字符串做键值(数组的Key字段)

PHP会将没有使用引号的键值当做常量,产生查找常量的开销,如果查找到了常量有这个字符串,那么就把常量作为这个值了

建议

严格使用引号作为键值,单引号即可

9.PHP周边的性能优化:(PHP前面有WebServer,后面有数据库)

10.PHP语言自身的分析、优化(底层C级别的优化)

11.尽量静态化:

        如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍,当然了,这个测试方法需要在十万级以上次执行,效果才明显。
         其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
          任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快。静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而是实例化可以销毁

12.销毁变量去释放内存,特别是大的数组

数组和对象在php特别占内存的,这个由于php的底层的zend引擎引起的,一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。特别是在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题

相关博客:提高PHP执行效率的50个技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用友BIP全球司库与交易银行大会圆满落幕

4月20日&#xff0c;用友全球司库与交易银行大会顺利召开。此次大会&#xff0c;用友以700万客户为依托&#xff0c;以最新BIP技术平台为纽带&#xff0c;面向银行生态&#xff0c;对市场、业务、产品领域进行全面开放合作。来自中国建设银行、中国交通银行、工商银行、中信银行…

C++重载,缺省参数,引用

目录 重载 参数的缺省 引用 引用总结&#xff1a; 重载 什么是函数的重载呢,在以前学C语言的时候都写过一个Max1的函数,目的就是求出两个数或者多个数的较大值,但它的参数很单一,只能接受一种参数,如果在已有int类型下还需要写一个double类型的Max函数就需要重新命令成Max2,…

SNMP Trap的session问题

1、前言 最近遇到了个问题&#xff0c;SNMPv3 Trap上报&#xff0c;在snmp agent侧修改了用户密码&#xff0c;管理站mibbroswer上没有修改trap用户的密码&#xff0c;仍然可接收到trap上报消息。通过Wireshark抓包&#xff0c;&#xff08;编辑–首选项–Protocols–SNMP–Us…

证照之星7.0下载安装教程及老版本升级说明

随着社会的发展&#xff0c;人们的证件照需求越来越多&#xff0c;很多人为了节省时间和成本&#xff0c;选择自己拍摄证件照&#xff0c;并进行后期制作。而证照之星是一款功能强大的证件照后期制作软件&#xff0c;能够帮助用户对证件照进行快速美化和处理。本文将为大家详细…

【SpringBoot】自从集成spring-security-oauth2后,实现统一认证授权so easy!

文章目录 一.前言1.principal和credential的区别2.生成私钥公钥3.用户认证分析4.认证解决方案4.1.单点登录4.2.第三方账号登录4.3.单token系统和双token系统业务逻辑 二.Spring Security1.快速入门2.基本原理FilterSecurityInterceptorExceptionTranslationFilterUsernamePassw…

Vue3+Three.js+antvG2实战项目 智慧城市(四)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

在时间序列预测中使用 FRFT

RNN Encoder–Decoder 每一个时刻都有一个隐藏状态向量 S_t&#xff0c;当这个向量传递到最后的一个 token 时&#xff0c;即 S_n (n为输入序列的最大长度)&#xff0c;它就是语义编码向量 C C 参与了Decoder过程中每一时刻隐藏状态和输出的计算. 最大的局限性就在于编码和解码…

美国访学J类签证费涨价15%|5月30日生效

2023年5月30日起&#xff0c;美国签证费用开始上调&#xff0c;其中访问学者的J类签证将由160美元调整至185美元&#xff0c;涨价15%。届时美国驻华大使馆将依据汇率做出调整&#xff0c;并公布具体的人民币数额。知识人网小编提醒相关签证人员提前做好准备。 美国国务院发布的…

手撕二叉树(图解+代码)

二叉树 &#x1f333;1.树的概念&#x1f333;2.二叉树的概念及性质&#x1f34e;2.1 二叉树的概念&#x1f34e;2.2 二叉树的性质 &#x1f333;3.二叉树的基本操作&#x1f34e;3.1 二叉树的遍历&#x1f34e;3.2 获取树中节点的个数&#x1f34e;3.3 获取叶子节点的个数&…

Python学习5:计算弓形的面积

类型&#xff1a;数值运算 描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ …

大数据学习初级入门教程(十七) —— Elasticsearch 8.7.0 完全分布式集群的安装、配置、启动和测试

好久没用 Elasticsearch 集群了&#xff0c;参考以前写的《大数据学习初级入门教程&#xff08;八&#xff09; —— Elasticsearch 7.6.2 单节点的安装、启动和测试_elasticsearch 7.6.2需要专属网络_孟郎郎的博客-CSDN博客》、《大数据学习初级入门教程&#xff08;九&#x…

面向对象与面向过程的区别

“劳累一天回到家中“ ”对象赶忙问我想吃些什么&#xff1f;“ “望着窗外淅淅沥沥的小雨 蛋炒饭吧” “雨声洗涤了心灵 炒饭温暖了肚子” “我没有问她炒饭是怎么做的&#xff0c;他也没有管我吃相有多难看” “我面向对象&#xff0c;她也面向对象” 面向对象和面向过程的区…

Unity3D:编辑场景模板

场景模板 Inspector 场景模板 Inspector 包含以下部分&#xff1a; Details&#xff1a;指定模板使用哪个场景&#xff0c;并包含模板的描述&#xff0c;该内容将出现在 New Scene 对话框中。Thumbnail&#xff1a;提供用于为模板创建预览图像的选项。Scene Template Pipelin…

ajax的介绍及使用

ajax的介绍 开发流程 前端 ajax:前后端沟通的桥梁 后端 ajax介绍 ajax叫做异步的Javascript和xml ajax通过浏览器与服务器&#xff08;后端&#xff09;进行少量数据交互&#xff0c;进行页面异步更新&#xff08;网页不会重新加载&#xff09; 优点&#xff1a; 减轻服务器负…

Java基础1

一、标识符 给类、接口、方法、变量等取名时用的字符序列 如&#xff1a; public class 类名-标识符{public static void 方法名-标识符(String[] args){int 变量或标识符 1000;} } 二、标识符的命名规范 组成部分 英文大小写字母、数字字符、美元($)符号、下划线(_)、中文…

「ChatGPT」十分钟学会如何在本地调用API_KEY(最新版 | 附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

1.2 行列式的性质和计算

学习目标&#xff1a; 当学习行列式性质和计算时&#xff0c;以下是一些具体的学习目标&#xff1a; 理解行列式的定义和计算方法&#xff0c;能够准确计算给定的行列式。&#xff08;最基本的&#xff09;熟练掌握行列式的基本性质&#xff0c;包括交换行列式的两行或两列、…

VRP开源的算例资源

VRP开源的算例资源 开源的算例资源 开源的MIP算例网址 1. MISOCP网址 Benchmark instances&#xff1a;多种问题的算例数据 TSP算例网址 VRP标杆算例网址 1. Networking and Emerging Optimization发布的VRP算例 2. PRP算例 3. 一个学者的主页上的算例 4. Chair in L…

Linux学习笔记(3)一些数据类型

1&#xff09;_u32 是一个无符号的32位整数类型&#xff0c;它在 Linux 内核中定义为 typedef unsigned int __u32。其中&#xff0c;__u32 是为了避免名称冲突而定义的特殊类型。无符号整数是一种表示正整数的数据类型&#xff0c;其取值范围为 0 到 4294967295&#xff08;2…

docker容器:本地私有仓库、harbor私有仓库部署与管理

目录 一、本地私有仓库 1、本地私有仓库简介 2、搭建本地私有仓库 3、容器重启策略介绍 二、harbor私有仓库部署与管理 1、什么是harbor 2、Harbor的特性 3、Harbor的构成 4、harbor部署及配置 ①部署docker-compose ②部署Harbor服务 ③登录创建项目 ④登录仓库并…