php类方法在线性能测试
在两个月前一个群里的朋友问了一个问题,他说:“现在他们公司的项目有一个模块的性能在线表现非常差,很长时间没有查出问题所在,老板一怒之下让他把所有类方法的执行时间给记录进行分析,并且不能影响现在的项目性能。”老板让他记录这些信息是为了分析具体影响性能的地方在哪些地方,待项目运行一段时间就去除。这个需求导致两个个问题,第一是怎么监听这个模块所有类方法的执行时间,第二是怎么能在不影响现在项目性能的情况下完成(本身性能就很差了),下面我们就这两个问题来分析:
一、怎么监听这个模块所有类方法的执行时间
这个问题他第一个想到的是在所有类方法处理前加一段代码记录时间,在返回数据前进行计算运行时间,然后记录日志。这种方法一定是可行的,而且对性能的影响不是很大,但是…… 反正我不会这么干了,程序员都是懒惰的,而且都是很聪明的,我们不是码农,如果这么实施,那么要改动的代码量太大了,重复很久没有意义没有技术含量的工作,其次以后删除的时候又来一次,我会奔溃。当然位朋友也不会这么干,所以我才知道了这个奇葩的需求。
怎么解决呢,本来这么任务解决起来确实很费劲,我们可以借用__call()和__callStatic()对类方法进行重载,在php5.3以前静态方法只能自己一个个去加了,感谢php5.3新增了__callStatic()魔术方法。有人会问了这个两个魔术方法都是在类方法不存在的时候才有用,他们怎么能实现这个需求呢?这个问题等会看代码,下面分析第二个问题吧。
二、怎么能在不影响现在项目性能的情况下完成
为啥我说会有这个问题呢?之前分析需求的时候确实有,但是在回答第一个问题的时候已经说了解决方案,我认为采用__call()和__callStatic()对类方法进行重载,比较简单实现,且对现有项目性能影响很小。
我们在这个问题里主要讨论一些其它方法,其实实现性能分析的扩展也有很多,xdebug、xhprof等,都知道xdebug性能损耗很大,不适合在正式环境使用,xhprof性能损耗相对较小,可在正式环境使用。那为什么不用xhprof呢?有三点:1.性能损耗略大;2.日志记录格式不灵活,对日志的分析造成困扰;3.有些函数没法统计,而且会出现严重错误(如:call_user_func_array)
既然已经确定解决方案,我们就先看一个demo吧
/** * 类方法性能监听 * * @author 戚银 thinkercode@sina.com * @date 2015-05-31 22:09 */ class demo { /** * 普通类方法 * * @access public * @return void */ public function test1(){ for($i=0; $i<100; ++$i){ } } /** * 静态方法 * * @access public * @return void */ public static function test2(){ for($i=0; $i<100; ++$i){ } } }
看上面的demo类,其中有两个方法,一个普通方法,一个静态方法,我们业务层调用的方式如下:
<?php (new demo())->test1(); demo::test2();
我们保证一个原则就是不改变类以外的代码,只调整该类来实现,下面我采用__call()和__callStatic()对类方法进行重载。
<?php /** * 类方法性能监听 * * @author 戚银 thinkercode@sina.com * @date 2015-05-31 22:09 */ class demo { /** * 普通类方法 * * @access public * @return void */ public function _test1(){ for($i=0; $i<100; ++$i){ } } /** * 静态方法 * * @access public * @return void */ public static function _test2(){ for($i=0; $i<100; ++$i){ } } /** * 类魔术方法 * * @access public * @param string $name * @param array $arguments * @return mixed */ public function __call($name, $arguments){ $startTime = microtime(true); $data = call_user_func_array(array($this, '_'.$name), $arguments); echo microtime(true) - $startTime; return $data; } /** * 类魔术方法 * * @access public * @param string $name * @param array $arguments * @return mixed */ public static function __callStatic($name, $arguments){ $startTime = microtime(true); $data = call_user_func_array(array(__CLASS__, '_'.$name), $arguments); echo microtime(true) - $startTime; return $data; } }
在这段代码里面我们添加了__call()和__callStatic()方法,如果只添加这两个方法是没用的,因为之前业务层的代码没变,调用的方法是存在的,要使调用的方法不存在而且只改变类本身,就只能在方法名前加一个下划线(这个规则自己定),然后我们在调用这个两个方法发现输出了两个方法的执行时间。
这样实现也发现了几个问题,改动的代码还是很多,每个类都要加,很累…………,其实善用手边的工具很好实现,使用继承是个很好的方式,把这个两个方法写到一个基类里,然后所有类都这继承这个基类。类方法名替换,除了构造方法和析构方法,直接使用编辑器批量替换即可,以后改回来也是。
注意:如果使用继承方式实现,__callStatic()方法的__CLASS__需要调整。
这里以在类方法前增加下划线实现,使业务层找不到类方法,其实这个例子还可以调整方法可见性来实现,但是可见性实现的方式有以下弊端:
1. 调整后以后想调整回来很有可能弄错类方法可见性,不知道哪些方法调整了。
2. 调整可见性只对类公共方法有效,对受保护和私用的方法不可用
当然如果只记录类公共方法的性能,可以使用改变方法可见性实现,但一定记得在注视上添加标注该方法是改变过的,而且一定被把public改成private,因为如果有类继承这个类就没法访问这个方法了。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

HTTP緩存頭的關鍵玩家包括Cache-Control、ETag和Last-Modified。 1.Cache-Control用於控制緩存策略,示例:Cache-Control:max-age=3600,public。 2.ETag通過唯一標識符驗證資源變化,示例:ETag:"686897696a7c876b7e"。 3.Last-Modified指示資源最後修改時間,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

禪工作室 13.0.1
強大的PHP整合開發環境