ホームページ >バックエンド開発 >PHPチュートリアル >PHP キャッシュ テクノロジに関する簡単な説明 3_PHP チュートリアル
php应用程序的性能优化
使用PHP编程的最大好处是学习这种编程语言非常容易以及其丰富的 库。即使对需要使用的函数不是十分了解,我们也能够猜测出如何完成一个特定的任务。
尽管PHP非常简单易学,但我们仍然需要花费一点时 间来学习PHP的一些编程技巧,尤其是与性能和内存占用相关的技巧。在PHP中,有许多小技巧能够使我们减少内存的占用,并提高应用程序的性能。在本篇文 章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。
通过在程序中设置计时的程序,并反复执行这些代码,我们可以获得有关程序执行速度的一组数据,这些数据可以可以用来发现程序中的瓶颈,以及如何进行 优化,提高应用程序的性能。
也许读者曾经听说过PEAR库吧。我们将使用PEAR库创建在分析时需要使用的例子,这也是对现有的代码进行分析的最简单的方法,它使我们无需使用 商用产品就能对代码进行分析。
我们要使用的库的名字是PEAR::Benchmark,它对于对代码进行分析和性能测试非常有用。这个 库提供一个名字为Benchmark_Timer()的类,能够记录一个函数调用和下一个函数调用之间的时间。在对代码的性能进行测试时,我们可以得到一 个详细的脚本执行结果,它非常简单,如下所示:
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(….)。
一次真实的性能测试经历
尽管上面的例子不错,但在对于决定如何优化你的站点代码设计方面,它 真的不能算是一个好例子。下面我将用我自己作为网站技术人员的一段亲身经历来说明如何解决性能方面存在的问题。
ウェブサイトで使用されているコードがよくわかりません。ウェブサイトは特殊なニーズに基づいて長年にわたって開発されているためです。あるモジュールにはウェブサイト変換コードが含まれ、別のモジュールにはウェブサイトの使用状況が記録され、他のモジュールも異なります独自の機能を持っています。 Web サイトの主な開発者と私は、Web サイトのコードを最適化する必要があることに気づきましたが、問題がどこにあるのかわかりませんでした。
できるだけ早くタスクを完了するために、Web サイトのメイン スクリプト コードを調査し、すべてのスクリプト コードとそれに含まれるファイルにいくつかの $bench-> setMarker() コマンドを追加し、$ を分析しました。 Bench-> getProfiling() の出力を調べたところ、何百回も使用された特定の言語名 (英語の en など) を取得するための変換コードに関連する関数呼び出しに問題があることがわかりました。各ページの回数。この関数が呼び出されるたびに、スクリプト コードは MySQL データベースにクエリを実行して、データベース テーブルから実際の言語名を取得します。
そこで、この種の情報用のバッファー システムを作成します。わずか 2 日間の作業でシステムのパフォーマンスが大幅に向上し、最初の 1 週間でページビュー数が 40% 増加しました。もちろん、これはコードを分析することでインターネット アプリケーションやインターネット Web サイトのパフォーマンスがどのように向上するかを示す一例にすぎません。
パフォーマンステスト関数呼び出し
Benchmark_Timer() は、スクリプトまたは Web ページ (およびそれに含まれるファイル) を分析する場合に特に役立ちますが、分析されたデータを取得するためにスクリプトを複数回ロードする必要があり、特定のクラスや特定のクラスに固有ではないため、科学的ではありません。関数呼び出し。PEAR:: Benchmark_Iterator と呼ばれる Benchmark ライブラリの別のクラスは、特定の関数またはクラス メソッドの分析情報を表示できます。その目的は、テストから一貫した結果を得ることができるようにすることです。スクリプトを 1 回実行して 10 秒間実行されたとしても、毎回必ず 10 秒間実行されるとは限らないことがわかっているからです。
いずれにしても、いくつかの例を見てみましょう:
//データベースに接続するコード
include_once("DB.php");
$dsn = 配列(
phptype => mysql,
ホストスペック => ローカルホスト,
データベース => データベース名,
;
ユーザー名 => ユーザー名,passWord => パスワード
);
$dbh = DB::connect($dsn);
関数 getCreatedDate($id)
{
グローバル $dbh;
> $stmt = "ユーザーの WHERE id=$id から作成日を選択";
// ここで PEAR::DB を使用します
$created_date = $dbh->getOne($stmt);
if ((PEAR::isError($created_date)) ||
(空($created_date))) {
false を返す;
} 他 {
$created_date を返す;
}
}
include_once Benchmark/Iterate.php;
$bench = 新しい Benchmark_Iterate;
//getDate関数を10回実行します
$bench->run(10, getCreatedDate, 1);
//分析情報を印刷します
print_r($bench-> get());
?>
上記のコードを実行すると、次のような結果が生成されます:
配列
(
[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
[平均] => 0.0064568161964417
[反復] => 10
)
上記の数値は、getCreatedDate() 関数の 10 回の実行の平均時間を表しています。実際のテストでは、少なくとも 1000 回実行する必要がありますが、この例の結果は問題を説明するのに十分です。