PHP数据缓存处理介绍下

2021-06-20 作者:未知   |   浏览(
PHP应用程序的性能优化

用PHP编程的最大好处是学习这种编程语言很容易与其丰富的库。即便对需要用的函数不是十分知道,大家也可以猜测出怎么样完成一个特定的任务。
尽管PHP很简单易学,但大家仍然需要花费一点时间来学习PHP的一些编程方法,特别是与性能和内存占用有关的方法。在PHP中,有很多小窍门可以使大家降低内存的占用,并提升应用程序的性能。在本篇文章中,大家将对PHP应用程序的剖析、怎么样改变脚本代码与比较优化前后的各种参数值进行简要的介绍。

通过在程序中设置计时的程序,并反复实行这部分代码,大家可以获得有关程序实行速度的一组数据,这部分数据可以可以用来发现程序中的瓶颈,与怎么样进行优化,提升应用程序的性能。

或许读者过去听说过PEAR库吧。大家将用PEAR库创建在剖析时需要用的例子,这也是对现有些代码进行剖析的最容易的办法,它使大家不需要用商用商品就能对代码进行剖析。
大家要用的库的名字是PEAR::Benchmark,它对于对代码进行剖析和性能测试很有用。这个库提供一个名字为Benchmark_Timer的类,可以记录一个函数调用和下一个函数调用之间的时间。在对代码的性能进行测试时,大家可以得到一个详细的脚本实行结果,它很简单,如下所示:

include_once;$bench = new Benchmark_Timer;$bench-> start;$bench-> setMarker;// 目前处于睡眠状况几分钟sleep;$bench-> sTOP;// 从计时器中获得剖析信息print_r);?> 上面代码实行后的输出如下所示: Array[1] =>Array[2] =>Array)

上面的数字好像是一组凌乱不堪的数字,但假如程序的规模更大,这部分数字就十分地有用了。
或许广大读者也能猜测到,数组的第一个表目是实质调用Benchmark_Timer类的办法,比如
$bench-> start、$bench-> setMarker和$bench-> sTOP,与这部分表目有关的数字是相当容易的,目前大家来仔细地研究这部分数字:
[0] =>Array 

time表目指的是何时对Benchmark_Timer的start办法调用的UNIX的timestamp,diff表目表示这次调用和上次调用之间的时间间隔,因为这里没上一次,因此显示出了一个破折号,total表目指的是自测试开始到这一特定的调用之前代码运行的总的时间。下面大家来看看下一个数组的输出:
[1] =>Array  

从上面的数字大家可以看出,在调用$bench-> start之后,程序运行了9.8943710327148E-05秒(也就是0.0000989秒)后开始调用$bench-> setMarker。

一次真实的性能测试经历
尽管上面的例子很好,但在对于决定怎么样优化你的站点代码设计方面,它真的不可以算是一个好例子。下面我将用我一个人作为网站技术职员的一段亲身经历来讲明怎么办性能方面存在的问题。
我并不大理解网站用的代码,由于它是依据特殊的需要,经过多年开发而成的━━其中的一个模块包括网站转换代码,另一个模块记录网站的用状况,其他的模块也各有各有哪些用途。我和网站的主要开发者都意识到网站的代码需要优化,但又不了解问题出在什么地方。
为了尽快地完成任务,我开始研究网站的主要脚本代码,并在全部脚本代码与其包含文件中添加了一些$bench-> setMarker命令,然后剖析$bench-> getProfiling的输出,并对得到的结果大吃一惊,原来问题出在一个与获得特定语言名字(比如en代表english)的转换代码的函数调用中,该函数在每一个页面上都会被用数百次。每次调用该函数时,脚本代码都会对一个MySQL数据库进行查看,从一个数据库表中获得真的的语言名字。
于是大家这些的信息创建了一个缓冲系统。经过短短2天时间的工作,大家使系统的性能得到了非常大的提升,第一周内页面的浏览量也因此而增加了40%。当然了,这只不过一个有关剖析代码可以提升网络应用或网络网站性能的例子。
性能测试函数调用
在剖析一个脚本或网页(与其包含文件)时,尽管Benchmark_Timer特别有用,但它并不科学,由于要获得剖析的数据大家需要多次加载脚本,而且它更不是针对某个类或函数调用的。
PEAR::Benchmark库中的另一个被称作Benchmark_Iterator的类可以非常不错地解决这一个问题,它可以针对特定的函数或类的办法,显示其剖析信息。它的作用是可以可以从测试中获得一致的结果,由于大家知晓,假如运行一段脚本一次,其运行时间为10秒,并不意味着它每次的运行时间一直10秒。

In any case, let's see some examples: // 连接数据库的代码include_once;$dsn = array;$dbh = DB::connect;function getCreatedDate{global $dbh;> $stmt = "SELECT created_date FROM users WHERE id=$id";// 在这里用PEAR::DB$created_date = $dbh-> getOne;if ) || )) {return false;} else {return $created_date;}}include_once 'Benchmark/Iterate.php';$bench = new Benchmark_Iterate;// 运行getDate函数10次$bench-> run;// 打印剖析信息print_r);?> 
运行上面的代码可以产生与下面一样的结果:
Array

上面的这部分数字非常不错理解,mean条目表示getCreatedDate函数10次运行的平均时间。在进行实质测试时,应该至少运行1000次,但这个例子得出的结果已经足够说明问题了。