Open Source Web Development Tutorials - Dev Shed
タイマーを利用したPHPアプリのベンチマーク
(2009/01/22公開)
HTTP圧縮を使ってデータベース行を表示
前ページで説明したとおり、これから作成する2番目のベンチマーク例は1番目の例と類似しています。主な違いは、データベース各行にHTTP圧縮を使用して表示する点です。つまり、すべてが予測どおりならば、これらの行をブラウザ上に表示するのに要する時間がわずかに短縮されるはずです。
さて、ベンチマークのテスト方法を説明したところで、次に、「DataCompressor」という追加クラスを定義します。これは、GZIPアルゴリズムを介してコンストラクターに入力されたすべてのデータを圧縮します。この新しいクラスのコードは、以下のとおりです。
// define 'DataCompressor' class
class DataCompressor{
private $data;
public function __construct($data){
if(!is_string($data)){
throw new Exception('Data must be a string!');
}
$this->data=$data;
}
public function compressData(){
// remove white spaces from (X)HTML code
$this->data=preg_replace(array("/r/","/n/"),'',$this->data);
// check if browser supports gzip encoding
if(strstr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip')){
// start output buffer
ob_start();
// echo page contents to output buffer
echo $this->data;
// compress data with gzip
$this->data=gzencode(ob_get_clean(),9);
// send content encoding http header
header('Content-Encoding: gzip');
}
return $this->data;
}
}
ご覧のとおり、「DataCompressor」クラスは、「compressData()」メソッドによって各コンストラクターに因数として渡されるすべての文字列を圧縮し、このデータを呼び出しコードに戻します。
このクラスはとても理解しやすいロジックを実行します。そこで、次の例に注目してください。前ページで登場した「USERS」MySQLデータベーステーブルから同じ10行をフェッチして、HTTP圧縮を使ってブラウザ上に表示します。
// example using HTTP compression
try{
// instantiate 'Timer' class
$timer=new Timer();
// start timer
$timer->start();
// connect to MySQL
$db=new MySQL(array
('host'=>'host','user'=>'user','password'=>'password','database'=>'database'));
$result=$db->query('SELECT * FROM users');
$data='';
while($row=$result->fetchRow()){
$data.='ID: '.$row['id'].' Name: '.$row['name'].' Email: '.$row['email'].'<br />';
}
$data.='Time spent in fetching database rows was '.$timer->stop().' seconds';
// use 'DataCompressor' object
$dataComp=new DataCompressor($data);
echo $dataComp->compressData();
}
catch(Exception $e){
echo $e->getMessage();
exit();
}
/* displays the following
ID: 1 Name: user1 Email: user1@domain.com
ID: 2 Name: user2 Email: user2@domain.com
ID: 3 Name: user3 Email: user3@domain.com
ID: 4 Name: user4 Email: user4@domain.com
ID: 5 Name: user5 Email: user5@domain.com
ID: 6 Name: user6 Email: user6@domain.com
ID: 7 Name: user7 Email: user7@domain.com
ID: 8 Name: user8 Email: user8@domain.com
ID: 9 Name: user9 Email: user9@domain.com
ID: 10 Name: user10 Email: user10@domain.com
Time spent in fetching database rows was 0.0049 seconds
*/
上の例は、最初の例と比較して、無視できるほどごくわずかな差異を示しているのが分かりますね。これは、データベース行が圧縮されてクライアントに送られたからです。しかし、どちらの例もローカルサーバーでテストしたことを思い出してください。ローカルサーバーという条件を考慮しても、データをHTTP圧縮した方がわずかに処理速度が速いという結果になりました。
前回PHP 5でタイマークラスを定義する方法を学習しましたが、今回はこのクラスを使った2つの具体例が極めて良好な結果を出すことを確認しました。もちろん、タイマークラスを使って、読者が使っているPHPアプリケーションの実性能を評価してみることをお勧めします。
最後に
これで今回の記事は終わりになります。連載第2回の今回は2つの実践例を使って、タイマークラスで双方の性能をベンチマークしてみました。大いに皆さんの参考になったでしょうか?
本連載の最後となる第3回では、同じタイマークラスを使い、データベーステーブルから行をフェッチする場合とテキストファイルからコンテンツ(内容)を読み出す場合を評価して、差異を確認します。
では、最終回でお会いしましょう!
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








