网站首页 > 基础教程 正文
你的项目中遇到性能问题了吗?遇到性能问题你是如何解决的呢?你的解决方式是否正确呢?下面就跟大家一起分享php项目的性能问题。
php在什么情况下会遇到性能问题呢?
在讨论性能问题时,我们要明白,整个项目的性能问题不仅仅包含php这一块,比如还有数据库服务、缓存服务、文件系统等,因此php性能问题在整个项目中只占一部分,在优化系统性能时要搞清楚是在优化系统整体性能还是在优化PHP单方面的性能。
首先,PHP是一门编程语言,我们知道每一门编程语言都有自己的优势及擅长的领域,所以使用php做了它不擅长的事情会很大概率遇到性能问题。再者,编码者在开发时PHP语法使用不恰当,导致php运行慢。最后,就是我们无法预估的问题,没有明确解决思路的性能问题。今天我们主要介绍PHP语言级的性能问题。
1、PHP性能检测的工具:ab
ab(apache benchmark)是由apache提供的压力测试工具,安装Apache时会自动安装此插件。
使用ab工具:
ab -n1000 -c100 https://www.test.com
-n表示请求数,后面跟数字,总共发起的请求数
-c表示并发数,后面跟数字,同一时刻的请求数
url最后跟要检测的目标地址
我们对百度进行一个检测,注意:对别的网站进行ab测试时,-n和-c后面的数字小点,不然会对目标网站造成一定的压力,然后人家发现你就把你给kill了:
这里我们只关注两个数据:
(1)、Requests per second:每秒可处理的请求数,越大越好 。
(2)、Time per request:每个请求处理耗时数,越小越好。
这样我们在每次进行过性能优化后可以通过前后这两项数据的对比确定优化有没有效果。
2、PHP语言级性能优化
(1)、多使用PHP自身携带的功能处理逻辑
如:有一个10000个用户信息的二维数组$userInfoList,要把它转为一维数组,且以uid为键名,username为键值,看多很多人写的代码都是通过foreach循环来实现,实际上这个是可以用PHP自带的数组函数来搞定的:
一般代码:
<?php $userMap = array(); foreach ($userInfoList as $val) { ? $userMap[$val['uid']] = $val['username']; } var_dump($userMap);
php数组函数:
<?php $userMap = array_column($userInfoList, 'username', 'uid'); var_dump($userMap);
这个函数就能实现这种功能,代码简单又容易理解,运行速度还比自己包装的快。
函数参数:array_column($array, $column, [$index_key]);
(2)、php内置函数的也存在快与慢的差异
比如:查找一个index是否存在于数组$array的key中,大家都能想到使用array_key_exists($index, $array),当然有的同学也想到了使用isset($array[$index])这个函数。看下面代码:
<?php $array = rang(2000, 10000) $start = time(); for ($i = 0; $i < 20000; $i ++) { ? ? ?isset($array[$i]);? //测完这个注释掉,打开下面测 ? ? ?//array_key_exists($i, $array);? //每项要多测几次,用平均值做比较 } $end = time(); $time = $end - $start; echo $time;
没错,这两个函数都能实现相同的功能,然而在经过测算后发现,isset()函数的速度要快于array_key_exists()函数。所以大家平时使用内置函数时,要思考一下什么时候该使用哪个同类型的函数。
建议phper们多了解些内置函数的实现思路及函数计算的时间复杂度,大概知道了运算的时间复杂度的量级,那么在使用的时候就能够选择合适的函数。
(3)、总结几个比较常见的注意点
- 减少PHP魔法函数的使用,也叫魔术方法
- 最好禁用掉PHP错误抑制符@,虽然很方便,但是最好别用
- 减少在循环体内做大量运算
- 使用带引号字符串做键值
好了,今天的分享就到这里了,如果喜欢我的内容,欢迎转发,留言~~
谢谢~~
- 上一篇: php也有协程? php协议
- 下一篇: PHP 数组:使用心得、示例代码和问题解决笔记
猜你喜欢
- 2024-10-12 六种流行语言(C、C++、Python、JavaScript、PHP、Java)对比
- 2024-10-12 「讨论」php与Python之间有何区别?Python和php之间的简单比较
- 2024-10-12 PHP获取目录中的全部内容 php获取目录列表
- 2024-10-12 重蔚自留地php学习第三十天——php数组
- 2024-10-12 脚把脚教你消息队列,典型的应用场景到底有哪些?
- 2024-10-12 php-生成器(yield) php生成html
- 2024-10-12 PHP——数组根据某一键值合并 php 数组 合并
- 2024-10-12 php 一步步实现mvc架构——view篇
- 2024-10-12 PHP函数shuffle()取数组若干个随机元素的方法及实例分析
- 2024-10-12 WordPress 主循环和全局变量 wordpress主题
- 05-03【Docker】部署 Elasticsearch(docker运行elasticsearch)
- 05-03若依框架改造,阿里docker部署(若依框架开发教程)
- 05-03软件测试/测试开发丨必知必会的Docker 命令
- 05-03如何从主机复制文件到Docker容器(如何从主机复制文件到docker容器里)
- 05-03Windows搭建Agent开发平台-WSL2+Dify本地部署及开发指南
- 05-03docker安装prometheus和grafana(docker如何安装)
- 05-03从Docker容器复制文件到主机的方法
- 05-03在Debian Docker环境一键部署Dify:手把手教你搭建本地AI应用平台
- 最近发表
-
- 【Docker】部署 Elasticsearch(docker运行elasticsearch)
- 若依框架改造,阿里docker部署(若依框架开发教程)
- 软件测试/测试开发丨必知必会的Docker 命令
- 如何从主机复制文件到Docker容器(如何从主机复制文件到docker容器里)
- Windows搭建Agent开发平台-WSL2+Dify本地部署及开发指南
- docker安装prometheus和grafana(docker如何安装)
- 从Docker容器复制文件到主机的方法
- 在Debian Docker环境一键部署Dify:手把手教你搭建本地AI应用平台
- 【Docker】部署Jira&Confluence
- 精辟!阿里大牛泪解:docker镜像制作——构建企业镜像LAMP+BBS
- 标签列表
-
- 菜鸟教程 (58)
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- pythonif (68)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)