|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
当然你可以把你最基本的功能放出来的时候就放出来,比如放到论坛上,让大家都参与,法式|功能|优化 利用PHP编程的最大优点是进修这类编程言语十分轻易和其丰厚的库。即便对需求利用的函数不是非常懂得,咱们也可以猜想出若何完成一个特定的义务。
虽然PHP十分复杂易学,但咱们依然需求消费一点工夫来进修PHP的一些编程技能,特别是与功能和内存占用相干的技能。在PHP中,有很多小技能可以使咱们削减内存的占用,并进步使用法式的功能。在本篇文章中,咱们将对PHP使用法式的剖析、若何改动剧本代码和对照优化前后的各类参数值停止扼要的引见。
经由过程在法式中设置计时的法式,并重复履行这些代码,咱们可以取得有关法式履行速度的一组数据,这些数据可以可以用来发明法式中的瓶颈,和若何停止优化,进步使用法式的功能。
或许读者已经传闻过PEAR库吧。咱们将利用PEAR库创立在剖析时需求利用的例子,这也是对现有的代码停止剖析的最复杂的办法,它使咱们无需利用商用产物就可以对代码停止剖析。
咱们要利用的库的名字是PEAR::Benchmark,它关于对代码停止剖析和功能测试十分有效。这个库供应一个名字为Benchmark_Timer()的类,可以纪录一个函数挪用和下一个函数挪用之间的工夫。在对代码的功能停止测试时,咱们可以失掉一个具体的剧本履行了局,它十分复杂,以下所示:
<?php
include_once("Benchmark/Timer.php");
$bench = new Benchmark_Timer; $bench->start();
$bench->setMarker('Start of the script'); 如今处于睡眠形态几分钟
sleep(5); $bench->stop(); // 从计时器中取得剖析信息
print_r($bench->getProfiling());
?>
下面代码履行后的输入以下所示:
Array
(
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => -
[total] => 0
)
[1] => Array
(
[name] => Start of the script
[time] => 1013214253.05761100
[diff] => 9.8943710327148E-05
[total] => 9.8943710327148E-05
)
[2] => Array
(
[name] => Stop
[time] => 1013214258.04920700
[diff] => 4.9915959835052
[total] => 4.9916949272156
)
)
下面的数字仿佛是一组混乱无章的数字,但假如法式的范围更大,这些数字就非常地有效了。
或许宽大读者也能猜想到,数组的第一个表目是实践挪用Benchmark_Timer()类的办法,例如
$bench->start()、$bench->setMarker()和$bench->stop(),与这些表目有关的数字是相当复杂的,如今咱们来细心地研讨这些数字:
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => -
[total] => 0
)
time表目指的是什么时候对Benchmark_Timer()的start()办法挪用的UNIX的timestamp,diff表目暗示此次挪用和前次挪用之间的工夫距离,因为这里没有上一次,因而显示出了一个破折号,total表目指的是自测试入手下手到这一特定的挪用之前代码运转的总的工夫。上面咱们来看看下一个数组的输入:
[1] => Array
(
[name] => Start of the script
[time] => 1013214253.05761100
[diff] => 9.8943710327148E-05
[total] => 9.8943710327148E-05
)
从下面的数字咱们可以看出,在挪用$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("DB.php");
$dsn = array(
'phptype' => 'mysql',
'hostspec' => 'localhost',
'database' => 'database_name',
'username' => 'user_name',
'password' => 'password'
);
$dbh = DB::connect($dsn); function getCreatedDate($id)
{
global $dbh; >$stmt = "SELECT created_date FROM users WHERE id=$id";
// 在这里利用PEAR::DB
$created_date = $dbh->getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else {
return $created_date;
}
}include_once 'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate; // 运转getDate函数10次
$bench->run(10, 'getCreatedDate', 1);// 打印剖析信息
print_r($bench->get());
?>
运转下面的代码可以发生与上面类似的了局:
Array
(
[1] => 0.055413007736206
[2] => 0.0012860298156738
[3] => 0.0010279417037964
[4] => 0.00093603134155273
[5] => 0.00094103813171387
[6] => 0.00092899799346924
[7] => 0.0010659694671631
[8] => 0.00096404552459717
[9] => 0.0010690689086914
[10] => 0.00093603134155273
[mean] => 0.0064568161964417
[iterations] => 10
)
下面的这些数字很好了解,mean条目暗示getCreatedDate()函数10次运转的均匀工夫。在停止实践测试时,应当最少运转1000次,但这个例子得出的了局已足够申明成绩了。
停止语
但愿宽大读者可以经由过程本篇文章把握若何敏捷地对PHP代码停止剖析的根基办法。在这里我还还要提示宽大读者的是,对代码停止剖析不是一件复杂的事儿,由于咱们必需把握大批的有关该种言语的特征。在代码中添加计时用的代码有助于找出运转速度迟缓的函数,使用屡次反复的办法使咱们可以发明对代码停止准确优化的办法。
刚开始写页面程序,调试完书中的例子。然后就可以尝试编写留言板了, |
|