TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen 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回では、同じタイマークラスを使い、データベーステーブルから行をフェッチする場合とテキストファイルからコンテンツ(内容)を読み出す場合を評価して、差異を確認します。

 では、最終回でお会いしましょう!

(編集部より:次回は、2009年1月29日に公開予定です)

(著者: Alejandro Gervasio)

原文へのリンク


前のページ     1    2    3    4   

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.