PHPキャッシュ技術の3つについて


PHPアプリケーションのパフォーマンス最適化PHPプログラミングを使用する最大の利点は、このプログラミング言語を学ぶのが非常に簡単で、豊富なライブラリであることです.使用する関数が十分に理解されていない場合でも、特定のタスクをどのように完了するかを推測することができます.PHPは非常に簡単ですが、PHPのプログラミングテクニック、特にパフォーマンスとメモリ消費に関するテクニックを学ぶのに少し時間がかかります.PHPでは、メモリの消費量を削減し、アプリケーションのパフォーマンスを向上させるための小さなテクニックがたくさんあります.本稿では,PHPアプリケーションの解析,スクリプトコードの変更,最適化前後の各種パラメータ値の比較について簡単に説明する.
プログラムにタイミングを設定し、これらのコードを繰り返し実行することで、プログラムの実行速度に関するデータのセットを得ることができます.これらのデータは、プログラムのボトルネックを発見し、どのように最適化し、アプリケーションのパフォーマンスを向上させることができます.
読者はPEAR庫を聞いたことがあるかもしれない.PEARライブラリを使用して、分析時に使用する必要がある例を作成します.これも既存のコードを分析する最も簡単な方法で、商用製品を使用する必要がなく、コードを分析することができます.私たちが使用するライブラリの名前はPEAR::Benchmarkで、コードの分析とパフォーマンステストに非常に役立ちます.このライブラリにはBenchmarkという名前があります.Timer()のクラスで、1つの関数呼び出しと次の関数呼び出しの間の時間を記録できます.コードのパフォーマンスをテストすると、次のように簡単な詳細なスクリプト実行結果が得られます.
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.8943710327148 E-05秒(つまり0.00000989秒)を実行した後、$bench->setMarker(...)を呼び出し始めることがわかります.
実際のパフォーマンステストの経験は、上記の例は良いですが、サイトコード設計を最適化する方法を決定する上で、本当に良い例とは言えません.次に、パフォーマンスの問題をどのように解決するかを、Webサイトの技術者としての自分の体験で説明します.私はウェブサイトが使用するコードをあまり理解していません.それは特殊な需要に基づいて、長年にわたって開発されたからです.その中の1つのモジュールはウェブサイトの変換コードを含んで、もう1つのモジュールはウェブサイトの使用状況を記録して、他のモジュールもそれぞれの役割を果たしています.私とウェブサイトの主な開発者は、ウェブサイトのコードを最適化する必要があることに気づいていますが、問題がどこにあるのか分かりません.タスクを迅速に完了するために、Webサイトの主なスクリプトコードを検討し、すべてのスクリプトコードとその含むファイルに$bench->setMarker()コマンドを追加し、$bench->getProfiling()の出力を分析し、結果に驚きました.問題は特定の言語の名前を取得することです(enはenglishを表す)変換コードの関数呼び出しでは、各ページに数百回使用されます.この関数を呼び出すたびに、スクリプトコードはMySQLデータベースをクエリーし、データベーステーブルから本当の言語名を取得します.そこで、このような情報はバッファシステムを作成します.わずか2日間の作業で、システムの性能を大幅に向上させ,1週間目のページの閲覧量も40%増加した.もちろん、これは分析コードがインターネットアプリケーションやインターネットサイトの性能を向上させる例にすぎません.パフォーマンステスト関数呼び出しは、スクリプトまたはWebページ(およびファイルを含む)を分析するときに便利ですが、Benchmark_Timer()は特に役に立ちます.分析されたデータを取得するには、スクリプトを複数回ロードする必要があり、クラスまたは関数に対して呼び出されないため、科学的ではありません.PEAR::Benchmarkライブラリのもう一つはBenchmark_と呼ばれていますIteratorのクラスはこの問題をうまく解決することができ,特定の関数やクラスの方法に対してその分析情報を表示することができる.スクリプトを1回実行すると、実行時間が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回実行する必要がありますが、この例の結果は問題を説明するのに十分です.