搜尋
首頁後端開發php教程PHP的性能探讨和测试_PHP教程

PHP的性能探讨和测试_PHP教程

Jul 21, 2016 pm 02:51 PM
php關於效能探討測試腳本語言

  1.缘起

  关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下。PHP的性能是否真 的就如同大家的感觉一样的差呢?本文就是围绕这么一个话题来进行探讨的。从源码、应用场景、基准性能、对比分析等几个方面深入分析PHP之性能问题,并通 过真实的数据来说话。

  2.从原理分析PHP性能

  从原理分析PHP的性能,主要从以下几个方面:内存管理、变量、函数、运行机制来进行分析。

  2.1内存管理

  类似Nginx的内存管理方式,PHP在内部也是基于内存池,并且引入内存池的生命周期概念。在内存池方面,PHP对PHP脚本和扩展的所有内 存相关操作都进行了托管。对大内存和小内存的管理采用了不同的实现方式和优化,具体可以参考以下文档:https://wiki.php.net /internals/zend_mm。在内存分配和回收的生命周期内,PHP采用一次初始化申请+动态扩容+内存标识回收机制,并且在每次请求结束后直 接对内存池进行重新mask。

  2.2变量

  总所周知,PHP是一种弱变量类型的语言,所以在PHP内部,所有的PHP变量都对应成一种类型Zval,其中具体定义如下:

PHP的性能探讨和测试 帮客之家

图一PHP变量

  在变量方面,PHP做了大量的优化工作,比如说Reference counting和copy on writer机制。这样能够保证内存使用上的优化,并且减少内存拷贝次数(请参考http://blog.xiuwz.com/2011/11/09 /php-using-internal-zval/)。在数组方面,PHP内部采用高效的hashtable来实现。

  2.3函数

  在PHP内部,所有的PHP函数都回转化成内部的一个函数指针。比如说扩展中函数

  ZEND_FUNCTION ( my_function );//类似function my_function(){}

  在内部展开后就会是一个函数

  void zif_my_function ( INTERNAL_FUNCTION_PARAMETERS );

  void zif_my_function(

  int ht,

  zval * return_value,

  zval * this_ptr,

  int return_value_used,

  zend_executor_globals * executor_globals

  );

  从这个角度来看,PHP函数在内部也是对应一个函数指针。

  2.4运行机制

  在话说PHP性能的时候,很多人都会说“C/C++是编译型,JAVA是半编译型,PHP是解释型”。也就是说PHP是先动态解析再代码运行的,所以从这个角度来看,PHP性能必然很差。

  的确,从PHP脚本运行来输出,的确是一个动态解析再代码运行的过程。具体来说,PHP脚本的运行机制如下图所示:

PHP的性能探讨和测试

图二 PHP运行机制

  PHP的运行阶段也分成三个阶段:

      Parse。语法分析阶段。

      Compile。编译产出opcode中间码。

      Execute。运行,动态运行进行输出。

  所以说,在PHP内部,本身也是存在编译的过程。并且据此产生了大量的opcode cache工具,比如说apc、eacc、xcache等等。这些opcode cache在生产环境基本上在标配。基于opcode cache,能到做到“PHP脚本编译一次,多次运行”的效果。从这点上,PHP就和JAVA的半编译机制非常类似。

  所以,从运行机制上来看,PHP的运行模式和JAVA是非常类似的,都是先产生中间码,然后运行在不同虚拟机上。

  2.5动态运行

  从上面的几个分析来看,PHP在内存管理、变量、函数、运行机制等几个方面都做了大量的工作,所以从原理来看,PHP不应该存在性能问题,性能至少也应该和Java比较接近

  这个时候就不得不谈PHP动态语言的特性所带来的性能问题了,由于PHP是动态运行时,所以所有的变量、函数、对象调用、作用域实现等等都是在 执行阶段中才确定的。这个从根本上决定了PHP性能中很难改变的一些东西:在C/C++等能够在静态编译阶段确定的变量、函数,在PHP中需要在动态运行 中确定,也就决定了PHP中间码不能直接运行而需要运行在Zend Engine上。

  说到PHP变量的具体实现,又不得不说一个东西了:Hashtable。Hashtable可以说在PHP灵魂之一,在PHP内部广泛用到,包含变量符号栈、函数符号栈等等都是基于hashtable的。

  以PHP变量为例来说明下PHP的动态运行特点,比如说代码:

  

  $var = “hello, blog.xiuwz.com”;

  ?>

  该代码的执行结果就是在变量符号栈(是一个hashtable)中新增一个项

PHP的性能探讨和测试

  当要使用到该变量时候,就去变量符合栈中去查找(也就是变量调用对出了一个hash查找的过程)。

  同样对于函数调用也基本上类似有一个函数符号栈(hashtable)。

  其实关于动态运行的变量查找特点,在PHP的运行机制中也能看出一些。PHP代码通过解释、编译后的流程下图:

PHP的性能探讨和测试

图3 PHP运行实例

  从上图可以看出,PHP代码在compile之后,产出的了类符号表、函数符号表、和OPCODE。在真正执行的时候,zend Engine会根据op code去对应的符号表中进行查找,处理。

  从某种程度上,在这种问题的上,很难找到解决方案。因为这是由于PHP语言的动态特性所决定的。但是在国内外也有不少的人在寻找解决方案。因为 通过这样,能够从根本上完全的优化PHP。典型的列子有facebook的hiphop(https://github.com/facebook /hiphop-php)。

  2.6结论

  从上面分析来看,在基础的内存管理、变量、函数、运行机制方面,PHP本身并不会存在明显的性能差异,但由于PHP的动态运行特性,决定了 PHP和其他的编译型语言相比,所有的变量查找、函数运行等等都会多一些hash查找的CPU开销和额外的内存开销,至于这种开销具体有多大,可以通过后 续的基准性能和对比分析得出。

  因此,也可以大体看出PHP不太适合的一些场景:大量计算性任务、大数据量的运算、内存要求很严格的应用场景。如果要实现这些功能,也建议通过扩展的方式实现,然后再提供钩子函数给PHP调用。这样可以减低内部计算的变量、函数等系列开销。

  3.基准性能

  对于PHP基准性能,目前缺少标准的数据。大多数同学都存在感性的认识,有人认为800QPS就是PHP的极限了。此外,对于框架的性能和框架对性能的影响很没有响应的权威数字。

  本章节的目的是给出一个基准的参考性能指标,通过数据给大家一个直观的了解。

  具体的基准性能有以下几个方面:

  1.裸PHP性能。完成基本的功能。

  2.裸框架的性能。只做最简单的路由分发,只走通核心功能。

  3.标准模块的基准性能。所谓标准模块的基准性能,是指一个具有完整服务模块功能的基准性能。

  3.1环境说明

  测试环境:

  Uname -aPnux db-forum-test17.db01.baidu.com 2.6.9_5-7-0-0 #1 SMP Wed Aug 12    17:35:51 CST 2009 x86_64 x86_64 x86_64 GNU/Pnux

  Red Hat Enterprise Pnux AS release 4 (Nahant Update 3)

  8  Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz

  软件相关:

  Nginx:nginx version: nginx/0.8.54  built by gcc 3.4.5 20051201 (Red Hat 3.4.5-2)

  Php5:(采用php-fpm)

  PHP 5.2.8 (cP) (built: Mar  6 2011 17:16:18)

  Copyright (c) 1997-2008 The PHP Group

  Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

  with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator

  bingo2:

  PHP框架。

  其他说明:

  目标机器的部署方式:nginx->php-fpm->php脚本。

  测试压力机器和目标机器独立部署。

  3.2裸PHP性能

  最简单的PHP脚本。

  

  require_once ‘./actions/indexAction.php’;

  $objAction = new indexAction();

  $objAction->init();

  $objAction->execute();

  ?>

  Acitons/indexAction.php里面的代码如下

  

  class indexAction

  {

  pubPc function execute()

  {

  echo ‘hello, world!’;

  }

  }

  ?>

  通过压力工具测试结果如下:

PHP的性能探讨和测试

  3.3裸PHP框架性能

  为了和3.2的对比,基于bingo2框架实现了类似的功能。代码如下

  

  require_once ‘Bingo/Controller/Front.php’;

  $objFrontController = Bingo_Controller_Front::getInstance(array(

  ‘actionDir’ => ‘./actions’,

  ));

  $objFrontController->dispatch();

  压力测试结果如下:

PHP的性能探讨和测试

  从该测试结果可以看出:框架虽然有一定的消耗,但对整体的性能来说影响是非常小的

  3.4标准PHP模块的基准性能

  所谓标准PHP模块,是指一个PHP模块所必须要具体的基本功能:

  路由分发。

  自动加载。

  LOG初始化&Notice日志打印。所以的UI请求都一条标准的日志。

      错误处理。

      时间校正。

      自动计算每个阶段耗时开销。

      编码识别&编码转化。

      标准配置文件的解析和调用

  采用bingo2的代码自动生成工具产生标准的测试PHP模块:test。

  测试结果如下:

PHP的性能探讨和测试

  3.5结论

  从测试数据的结论来看,PHP本身的性能还是可以的。基准性能完全能够达到几千甚至上W的QPS。至于为什么在大多数的PHP模块中表现不佳, 其实这个时候更应该去找出系统的瓶颈点,而是简单的说OK,PHP不行,那我们换C来搞吧。(下一个章节,会通过一些例子来对比,采用C来处理不见得有特 别的优势)

  通过基准数据,可以得出以下几个具体的结论:

  1.PHP本身性能也很不错。简单功能下能够达到5000QPS,极限也能过W。

  2.PHP框架本身对性能影响非常有限。尤其是在有一定业务逻辑和数据交互的情况下,几乎可以忽略。

  3.一个标准的PHP模块,基准性能能够达到2000QPS(80 cpu idle)。

  4.对比分析

  很多时候,大家发现PHP模块性能不行的时候,就来一句“ok,我们采用C重写吧”。在公司内,采用C/C++来写业务逻辑模块的现象到处都有,在前几年甚至几乎全部都是采用C来写。那时候大家写的真是一个痛苦:调试难、敏捷不要谈。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/371766.htmlTechArticle1.缘起 关于PHP,很多人的直观感觉是PHP是一种灵活的脚本语言,库类丰富,使用简单,安全,非常适合WEB开发,但性能低下。PHP的性能是否...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的目的:構建動態網站PHP的目的:構建動態網站Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP:處理數據庫和服務器端邏輯PHP:處理數據庫和服務器端邏輯Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

您如何防止PHP中的SQL注入? (準備的陳述,PDO)您如何防止PHP中的SQL注入? (準備的陳述,PDO)Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python:代碼示例和比較PHP和Python:代碼示例和比較Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP行動:現實世界中的示例和應用程序PHP行動:現實世界中的示例和應用程序Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:輕鬆創建交互式Web內容PHP:輕鬆創建交互式Web內容Apr 14, 2025 am 12:15 AM

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python:比較兩種流行的編程語言PHP和Python:比較兩種流行的編程語言Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的持久相關性:它還活著嗎?PHP的持久相關性:它還活著嗎?Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中