我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP性能的宏观分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP性能的宏观分析

本篇内容主要讲解“PHP性能的宏观分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP性能的宏观分析”吧!

宏观层面,也就是对 PHP 语言本身的性能分析又分为三个方面:

  1. PHP 作为解释性语言性能有其天然的缺陷

  2. PHP 作为动态类型语言在性能上也有提升的空间

  3. 当下主流 PHP 版本本身语言引擎性能

一、PHP 作为解释性语言的性能分析与提升

PHP 作为一门脚本语言,也是解释性语言,是其天然性能受限的原因,因为同编译型语言在运行之前编译成二进制代码不同,解释性语言在每一次运行都面对原始脚本的输入、解析、编译,然后执行。如下是 PHP 作为解释性语言的执行过程。

PHP性能的宏观分析

如上所示,从上图可以看到,每一次运行,都需要经历三个解析、编译、运行三个过程。

那优化的点在哪里呢?可以想见,只要代码文件确定,解析到编译这一步都是确定的,因为文件已不再变化,而执行,则由于输入参数的不同而不同。在性能 优化的世界里,至上绝招就是在获得同样结果的情况下,减少操作,这就是大名鼎鼎的缓存。缓存无处不在,缓存也是性能优化的杀手锏。于是乎 OpCode  缓存这一招就出现了,只有***次需要解析和编译,而在后面的执行中,直接由脚本到 Opcode,从而实现了性能提速。执行流程如下图所示:

PHP性能的宏观分析

相对每一次解析、编译,读到脚本之后,直接从缓存读取字节码的效率会有大幅度的提升,提升幅度到底有多大呢?

我们来做一个没有 Opcode 缓存的实验。20 个并发,总共 10000 次请求没有经过 opcode 缓存的请求,,得到如下结果:

PHP性能的宏观分析

其次,我们在服务器上打开 Opcode 缓存。要想实现 opcode 缓存,只需要安装 APC、Zend  OPCache、eAccelerator 扩展即可,即使安装了多个,也只启用其中一个。注意的是,修改了 php.ini 配置之后,需要重新加载  php-fpm 的配置。

这里分别启用 APC 和 Zend OPCache 做实验。启用 APC 的版本。

PHP性能的宏观分析

可以看到,速度有了较大幅度的提升,原来每个请求 110ms,每秒处理请求 182 个,启用了 APC 之后 68ms,每秒处理请求 294 个,提升速度将近 40%。

在启用了 Zend Opcache 的版本中,得到同 APC 大致相当的结果。每秒处理请求 291 个,每请求耗时 68.5ms。

PHP性能的宏观分析

从上面的这个实验可以看到,所用的测试页面,有 40ms 以上的时间花在了语法解析和编译这两项上。通过将这两个操作缓存,可以将这个处理过程的速度大大提升。

这里附加补充一下,OpCode 到底是什么东东,OpCode 编译之后的字节码,我们可以使用bytekit 这样的工具,或者使用 vld PHP 扩展来实现对 PHP 的代码编译。如下是 vld 插件解析代码的运行结果。

PHP性能的宏观分析

可以看到每一行代码被编译成相应的 OpCode 的输出。

二、PHP 作为动态类型语言的性能分析与改进

第二个是 PHP 语言是动态类型的语言,动态类型的语言本身由于涉及到在内存中的类型推断,比如在 PHP 中,两个整数相加,我们能得到整数值,一个整数和一个字符串相加,甚至两个字符串相加,都变成整数相加。而字符串和任何类型连接操作都成了字符串。

<?php
$a = 10.11;
$b = "30";
var_dump($a+$b);
var_dump("10"+$b);
var_dump(10+"20");
var_dump("10"+"20");

运行结果如下:

float(40.11)
int(40)
int(30)
int(30)

语言的动态类型为开发者提供了方便,语言本身则会因为动态类型而降低效率。在 Swift 中,有一个特性叫类型推断,我们可以看看类型推断会带来多大的一个效率上的差别呢?对于需要类型推断与不需要类型推断两段 Swift 代码,我们尝试编译一下看看效果如何。 ***段代码如下:

PHP性能的宏观分析

这是一段 Swift 代码,字典只有 14 个键值对,这段代码的编译,9 分钟了还没有编译完成(5G 内存,2.4GHz CPU),编译环境为 Swift 1.2,Xcode 6.4。

PHP性能的宏观分析

但是如果调整代码如下:

PHP性能的宏观分析

也就是加上了类型限定,避免了 planeLocation 的类型推断。编译过程花了 2S 。

PHP性能的宏观分析

可见,作为动态类型附加的类型推断操作极大地降低了程序的编译速度。 当然,这个例子有点极端,用 Swift 来类比 PHP 也不一定合适,因为 Swift 语言本身也还在不断的进化过程中。本例子只是表明在编程语言中,如果是动态类型语言,就涉及到对动态类型的处理,从编译的角度讲是会受影响的。

那么作为动态类型的 PHP 的效率如何提升呢?从 PHP  语言本身这个层面是没有办法解决的,因为你怎么写也是动态类型的代码。解决办法就是将PHP转化为静态类型的表示,也就是做成扩展,可以看到,鸟哥的很多 项目,比如 Yaf  框架,都是做成了扩展的,当然这也是由于鸟哥是 C 高手。扩展由于是 C 或者 C++  而写,所以不再是动态类型,又加之是编译好的,而 C 语言本身的效率也会提升很多。所以效率会大幅度提高。

下面我们来看一段代码,这段代码,只是实现了简单的素数运算,能计算指定值以内的素数个数,用的是普通的筛选法。现在看看扩展实现,跟 PHP 原生实现的效率差别,这个差别当然,不仅仅是动态类型和编译类型的差别,还有语言效率的差别。

首先是用纯 PHP 写成的算法,计算 1000 万以内的素数个数,耗时在 33s 上下,实验了三次,得到的结果基本相同。

PHP性能的宏观分析

其次,我们将这个求素数个数的过程,编写成了 PHP 扩展,在扩展中实现了 getprimenumbers 函数,输入一个整数,返回小于该整数的素数。得到的结果如下,这个效率的提升是非常惊人的,在 1.4s 上下即返回。速度提升 20 倍以上。

PHP性能的宏观分析

可以想见,静态和编译类型的语言,其效率得到了惊人的提升。本程序的 C 语言代码如下:

PHP_FUNCTION(get_prime_numbers) {     long value;     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &value) == FAILURE) {             return;     }      int *numbers = (int *)malloc(sizeof(int)*128*10000);      memset(numbers, 0x0, 128*10000);     int num = 2;         numbers[0] = 2;         numbers[1] = 3;         bool flag = true;         double f = 0;         int i = 0;         int j = 0;         for(i=5; i<=value; i+=2)         {             flag = true;             f = sqrt(i);             for(j=0; j<num;j++)             {                 if(i%numbers[j]==0)                 {                     flag = false;                     break;                 }                 if(numbers[j]>f)                 {                     break;                 }             }             if(flag)             {                 numbers[num] = i;                 num++;             }         }         free(numbers);         RETURN_LONG(num); }

三、PHP 语言本身底层性能引擎提升

第三个性能优化层面是语言本身的性能提升,这个就不是我们普通开发者所能做的了。在 PHP  7以前,寄希望于小版本的改进,但是改进幅度不是非常的显著,比如 PHP 5.3 、PHP 5.4、PHP 5.5、PHP 5.5  对同一段代码的性能比较,有一定程度的进步。

PHP 5.3 的版本在上面的例子中已讲过,需要 33s 左右的时间,我们现在来看别的PHP版本。分别运行如下:

PHP 5.4 版,相较 5.3 版已经有一定程度的提升。快 6 秒左右。

PHP性能的宏观分析

PHP 5.5 版在 PHP 5.4的基础上又进了一步,快了 6S。

PHP性能的宏观分析

PHP5.6 反而有些退步。

PHP性能的宏观分析

PHP 7 果真是效率提升惊人,是 PHP5.3 的 3 倍以上。

PHP性能的宏观分析

以上是求素数脚本在各个 PHP 版本之间的运行速度区别,尽管只测试了这一个程序,也不是特别的严谨,但是这是在同一台机器上,而且编译 configure 参数也基本一样,还是有一定可比性的。

在宏观层面,除了上面的这些之外,在实际的部署过程中,对 PHP 性能的优化,还体现为要减少在运行中所消耗的资源。所以 FastCGI 模式和 mod_php 的模式比传统的 CGI 模式也更为受欢迎。因为在传统的 CGI 模式中,在每一次脚本运行都需要加载所有的模块。而在程序运行完成了之后,也要释放模块资源。如下图所示:

PHP性能的宏观分析

而在 FastCGI 和 mod_php 模式中,则不需要如此。只有 php-fpm 或者 Apache 启动的时候,需要加载一次所有的模块,在具体的某次运行过程中,并不需要再次加载和释放相关的模块资源。

PHP性能的宏观分析

到此,相信大家对“PHP性能的宏观分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP性能的宏观分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP性能的宏观分析

本篇内容主要讲解“PHP性能的宏观分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP性能的宏观分析”吧!宏观层面,也就是对 PHP 语言本身的性能分析又分为三个方面:PHP 作为解释性语言
2023-06-17

PHP 服务实现性能剖析、跟踪和可观察性实践

数据上报至链路追踪控制台后,链路追踪组件进行实时聚合计算和持久化,形成链路明细、性能总览、实时拓扑等监控数据。您可以据此进行问题排查与诊断。
PHP剖析链路2024-12-13

PHP使用Reli分析性能,生成PHP性能火焰图

通过使用Reli工具,开发人员可以深入了解PHP应用程序的执行流程并生成火焰图以可视化性能瓶颈。通过分析火焰图,可以识别函数调用树、执行时间和热区,从而发现性能瓶颈并进行优化。通过采取重构循环、缓存查询、优化算法和并行化处理等措施,可以提高应用程序性能。Reli还提供持续监控,以便及早发现性能回归,确保应用程序始终保持最佳性能。
PHP使用Reli分析性能,生成PHP性能火焰图
2024-04-02

php性能优化实例分析

这篇文章主要介绍了php性能优化实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php性能优化实例分析文章都会有所收获,下面我们一起来看看吧。前言如何提高程序运行速度,减轻服务器压力是服务端开发必须面对的
2023-07-02

PHP 性能优化:性能指标解读与分析

php 性能优化需要关注关键性能指标(kpi),包括请求/秒 (rps)、响应时间、内存使用率、cpu 利用率和错误率。分析这些 kpi 可识别性能瓶颈。实战案例中,rps 低、响应时间长表明 cpu 利用率过高,导致服务器处理请求困难。解
PHP 性能优化:性能指标解读与分析
2024-05-10

PHP接口性能优化之代码测试与性能分析(PHP接口中代码测试与性能分析的重要性)

PHP接口性能优化需要注重代码测试和性能分析。代码测试可以检测错误、提高代码覆盖率和增强信心。性能分析可以识别慢速请求、资源密集型操作和优化数据库查询。策略包括单元测试、集成测试、性能分析工具、请求跟踪和性能基准。最佳实践包括缓存、优化网络请求、最小化数据库查询和定期维护。通过代码测试和性能分析的持续努力,开发人员可以优化PHP接口性能,提供卓越的用户体验。
PHP接口性能优化之代码测试与性能分析(PHP接口中代码测试与性能分析的重要性)
2024-04-02

Reli:PHP性能分析利器,生成PHP性能火焰图

首先你需要理解SIGHUP(终端挂起信号)是一种信号,当关闭控制终端时,它会终止Linux进程。如果意外关闭终端或失去与主机的连接,所有正在运行的进程将被自动终止。
PHP性能终端2024-11-30

PHP观察者模式的应用实例分析

本篇内容主要讲解“PHP观察者模式的应用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP观察者模式的应用实例分析”吧!PHP 观察者模式应用场景实例详解代码
2023-06-21

PHP 函数的性能分析工具有哪些?

php 函数性能分析工具有助于识别瓶颈并改进代码。本文介绍了 xhprof(采样剖析)、tideways(商业平台)和 blackfire.io(saas 服务);实战案例展示了使用 xhprof 分析函数执行时间。PHP 函数的性能分析工
PHP 函数的性能分析工具有哪些?
2024-04-18

从“监控”到“可观测性”,打造可观测性分析平台的技术逻辑

基于监控的运维方式是运用指标和仪表盘来对故障问题进行分类,这是软件行业的普遍做法。在单体应用架构时代,由于系统交互比较简单,数据收集有限,依靠运维人员的经验和直觉来检测系统问题是有意义的。通过监控CPU、内存等资源消耗情况、数据库连接情况和
监控2024-12-01

PHP 函数对项目性能的影响分析

php 函数使用不当会显著影响项目性能,主要体现在内存消耗、处理时间和 i/o 操作。最佳实践包括:选择合适函数(时间和内存复杂度);避免嵌套函数(内存消耗);缓存结果(减少重复执行);使用索引数组(加快数组访问);考虑使用预编译(提高性能
PHP 函数对项目性能的影响分析
2024-04-13

PHP 性能优化:深入案例分析

php 性能优化通过分析和优化,可以显著提升网站性能。优化措施包括查询优化、数据缓存、i/o 优化。案例研究表明,这些优化措施可减少页面加载时间,提升数据库查询效率,并增强用户体验。通过遵循最佳实践并应用代码示例,可以有效优化 php 应用
PHP 性能优化:深入案例分析
2024-05-10

PHP 函数的性能分析和优化技巧

使用 php 函数性能分析和优化技巧可显着提高应用程序性能。分析方法包括使用 xdebug 扩展、tideways 工具和进行微基准化测试。优化措施包括消除瓶颈、减少函数调用、使用高效的数据结构、避免不必要的计算和利用 opcache 扩展
PHP 函数的性能分析和优化技巧
2024-04-14

pg 性能分析

postgresql 库中出现性能问题,对于复杂的sql, 常用分析过程: 简化SQL,定位性能异常点: 简化输出。像下面语句,可以先把输出的子查询去掉。有时也可以使用count(*)代替输出。 逐个测试union(minus),with子句。基于这些
pg 性能分析
2015-06-27

PHP静态化对网站性能的影响分析

PHP静态化对网站性能的影响分析随着互联网的迅速发展,网站的性能优化变得愈发重要。其中,PHP静态化技术是一种有效的手段,可以提高网站的性能和用户体验。本文将对PHP静态化对网站性能的影响进行分析,并提供具体的代码示例。一、PHP静态化
PHP静态化对网站性能的影响分析
2024-03-05

PHP 性能分析:识别和优化瓶颈

识别和优化 php 应用程序中的性能瓶颈:识别瓶颈:使用剖析器、模拟流量和检查日志。优化瓶颈:优化数据库查询、缓存页面和数据、减少 http 请求、启用 gzip 压缩和优化 web 服务器配置。实战案例:通过优化图像加载,页面加载时间显着
PHP 性能分析:识别和优化瓶颈
2024-05-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录