热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php性能的问题

一.影响php性能的常见原因1.php自身语法使用不当2.php做了不擅长的时期()3.php的周边环境(服务器Linux,磁盘:文件存储,数据库,缓存:内存,网络:带宽)4.php自身的短板5.未知

一.影响php性能的常见原因

1.php自身语法使用不当

2.php做了不擅长的时期()

3.php的周边环境(服务器Linux,磁盘:文件存储,数据库,缓存:内存,网络:带宽)

4.php自身的短板

5.未知问题

二、分析

PHP代码运行流程 
*.php(PHP文件)->Scanner(扫描代码,分析)->Exprs(保存成zend引擎可以识别的文件)->Parser(解析)->Opcodes(能被执行的文件)->Exec(执行)->Output(输出结果)

 

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

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

性能问题

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

为什么性能低?

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

解决方法:

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

 1.2 PHP内置函数的性能优劣。

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

建议:
多去了解PHP内置函数的执行实现复杂度。
测试方法:比较效率测试,如用microtime()函数,取差值,精确到毫秒级别;Linux的time命令可以查看开销。

 

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

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

1.4 合理使用内存

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

    当出现变量引用是,需要把两个变量都unset才可以注销内存;或者直接$变量=null来注销

1.5 尽量少用正则表达式

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

1.6 避免在循环内做运算。

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

1.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呈现,也就是配合模板引擎做模板输出,其实就是一些字符串文本处理。

 

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

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

    建议:严格使用引号作为键值,单引号即可。

1.9 尽量静态化

   一个方法能被静态,就声明它为静态的,速度可以提高1/4,

其实静态方法和非静态方法的效率主要区别在内存:
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快。静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而是实例化可以销毁。

 

 1.10   用单引号代替双引号来包含字符串,这样做会更快一些。因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会

1.11  echo 比 print 快,并且使用 echo 的多重参数(译注:指用逗号而不是句点)代替字符串 连接

1.12 include 文件时尽量使用绝对路径,因为它避免了 PHP 去 include_path 里查找文件的速 度,解析操作系统路径所需的时间会更少

1.13  include()与require()的区别及require_once的代价

include() 遇到文件处理失败时,会产生一个警告;

而require()则会显示一个致命错误。也就是说在脚本执行过程中,如果代码中有错误,include()则会忽略错误并继续执行脚本,而require()则会停止脚本运行。
在php中使用require_once
/include_once虽然方便,但是代价昂贵,据测试数据来看,require_once比require慢3-4倍,所以在php开发中,我们应该尽量使用require/include。

 

1.14 foreach 效率更高,尽量用 foreach 代替 while 和 for 循环;

总体来说,如果数据库过几十万了,才能看出来快一点还是慢一点,如果低于10万的循环,就不用测试了。php推荐用foreach。
循环数字数组时,for需要事先count($arr)计算数组长度,需要引入自增变量$i,每次循环都要进行条件判断$i
<$c,然后自增$i++,输出数组元素时,$arr[$i]需要进行哈希操作.

而foreach循环数组时,指针会自动指向下一个元素,不需要计算数组长度,没有条件判断和自增变量,调用元素时也没有哈希操作,所以性能肯定要比for和while高.另外,for和while对存在键值映射的关联数组无能为力.
所以,遍历数组,首选foreach.foreach也是我PHP里最喜欢的关键字,因为它确实强大.array_map
/array_filter/array_walk遍历数组的方式和foreach一样,但需要执行回调函数,所以也比foreach慢.

2.php周边环境的性能优化

性能排列:内存>数据库>磁盘>网络

2.1 减少文件的操作,操作完成要关闭文件。

2.2 

网络优化:

  网络原因:

   1.对方接口不确定。接口地址错误;数据错误

    2.网络不稳定

   网络优化:

  a.设置超时时间

   1.链接超时 200ms

   2.读超时  800ms

   3.写超时 500ms

  b.将串行请求并行化;把多次请求,放到一次请求中

    1.使用curl_multi_*()

     2.使用swoole扩展

2.3 压缩php接口

   使用: Gzip ,php有对应压缩和解压的函数

   利:利于我们的数据的数据输出,Client端能更快获取数据

   弊:额外的cpu开销

2.4 缓存

 对于变化少,访问量大的数据做缓存;缓存可以减轻服务器负载、减低网络阻塞、增强www可扩展性

  a.文件缓存

  b.memcached

  c.Redis

2.5 旁路方案

 

3.php性能的测试

3.1 使用内置函数,测试代码执行时间;microtime()

3.2 Linux的time命令

3.3 apache测试工具,ab 可以测试并发时执行代码所需要的时间。


推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
至上励合_安儿_466
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有