私は最近、プログラムのパフォーマンスの最適化にしばらく取り組んできましたが、興味深いアイデアがあるので、それを共有したいと思います。
キャッシュは、「時間のためのスペース」戦略の典型的なアプリケーション モードであり、システム パフォーマンスを向上させる重要な方法です。キャッシュを使用すると、アクセス量が多い場合にデータベース操作の数が大幅に削減され、システムの負荷が大幅に軽減され、システムのパフォーマンスが向上します。ページ キャッシュと比較して、結果セットはフォーマット情報を含まない一種の「生データ」であり、データ量が比較的少なく、再フォーマットできるため、非常に柔軟です。 PHP は「コンパイルと実行を同時に行う」スクリプト言語であるため、結果セットのキャッシュをある程度まで使用する非常に便利な方法、つまり、対応するデータ定義コード セグメントを動的に含めることによってキャッシュを使用する方法も提供します。 「RamDisk」上にキャッシュを構築すればさらに効率が上がるはずです。以下は参考用の小さなサンプルコードです。
// キャッシュを使用してデータをロードします
関数load_data($id,$cache_lifetime) {
// 戻りデータ
$data = 配列();
// キャッシュファイル名を作成します
$cache_filename = 'cache_'.$id.'.php';
// キャッシュ ファイルの最終変更時刻を確認します
$cache_filetime = filemtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** キャッシュの有効期限は切れていない
include($cache_filename);
} それ以外 {
//** キャッシュの有効期限が切れています
// データベースからデータをロードします
// ...
while ($dbo->nextRecord()) {
// $data[] = ...
}
// データを php ファイルとしてフォーマットします
$data_cache = "
while (list($key, $val) = each($data)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NAME'=>"".qoute($val['NAME'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// データをキャッシュファイルに保存します
if ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
$data を返します。
}
?>
該当する状況:
1. データは比較的安定しており、主に読み取り操作が行われます。
2. ファイル操作はデータベース操作よりも高速です。
3. 複雑なデータアクセス、大量のデータアクセス、集中的なデータアクセス、およびシステムデータベースへの非常に高い負荷。
4. Web/DB分離構造またはマルチWeb単一DB構造。
未確認の質問:
1. 同時アクセス中にファイルの読み取りと書き込みを行うと、ロックの問題が発生するかどうか。
2. 関係するデータ ファイルが多すぎる場合のパフォーマンスはどうなりますか?
拡張のアイデア:
1. JavaScript データ定義コードを生成し、クライアント上で呼び出します。
2. まだ考えていない…
一緒に議論できれば幸いです。
キャッシュ
巨大な PHP アプリケーションのパフォーマンスを向上させたい場合は、キャッシュを使用することも良い方法です。 Zend Cache、APC、Afterburner Cache など、多くのキャッシュ ソリューションが利用可能です。
これらの製品はすべて「キャッシュ モジュール」です。 .php ファイルに対するリクエストが最初に発生すると、Web サーバーのメモリに PHP 中間コードが保存され、その後のリクエストには「コンパイルされた」バージョンで応答します。このアプローチでは、ディスク アクセスが最小限に抑えられ (コードが読み取られて解析されている)、コードがメモリ内で直接実行されるため、サーバーのリクエストに対する応答が大幅に速くなり、アプリケーションのパフォーマンスが大幅に向上します。もちろん、キャッシュ モジュールは PHP ソース ファイルの変更も監視し、必要に応じてページを再キャッシュします。これにより、ユーザーが古い PHP コードによって生成されたページを取得するのを防ぎます。キャッシュモジュールはサーバーの負荷を大幅に軽減し、PHP アプリケーションの応答効率を向上させることができるため、負荷の高い Web サイトに非常に適しています。
これらのキャッシング製品の選び方
Zend Cache は、PHP エンジンと無料の Zend Optimizer を提供する前述の会社 Zend Technologies の商用ソフトウェアです。 Zend Cache は確かに価値があります。大規模な PHP ページの場合、最初の実行後に速度が向上し、サーバーで使用できるリソースが増加するのを感じることができます。残念ながら、この製品は無料ではありませんが、場合によっては依然として大きな価値がある可能性があります。
Afterburner Cache は、Bware Technologies の無料のキャッシュ モジュールです。この製品は現在ベータ版です。 Afterburner キャッシュは Zend Cache に似ていますが、(まだ) Zend Cache ほどパフォーマンスは向上しておらず、Zend Optimizer では動作しません。
APC は Alternative PHP Cache の略称で、Community Connect のもう 1 つの無料のキャッシュ モジュールです。すでに正式に使用できるほど安定した製品となっており、リクエストへの対応速度も大幅に向上しているようだ。
圧縮について
Remote Communications の無料の Apache モジュール mod_gzip には、このタイプのコンテンツ エンコーディングをサポートするブラウザ向けに静的 Web コンテンツを圧縮する機能があります。静的 Web コンテンツの大部分では、mod_gzip が非常にうまく機能します。 mod_gzip は Apache に簡単にコンパイルでき、DSO としても使用できます。 Remote Communications によると、mod_gzip は mod_php、mod_perl などの動的コンテンツも圧縮できます。何度も試しましたが、うまくいかないようでした。 mod_gzip に関する多くのフォーラムや記事を読みましたが、この問題は mod_gzip の次のバージョン (おそらく 1.3.14.6f) で解決される予定のようです。それまでは、Web サイトの静的部分で mod_gzip を使用できます。
ただし、実際には動的コンテンツを圧縮したくない場合があるため、他の方法を見つける必要があります。 1 つの方法は、class.gzip_encode.php を使用することです。これは、PHP スクリプトの最初と最後でクラスの特定の関数を呼び出すことによって、ページのコンテンツを圧縮するために使用できる PHP クラスです。このソリューションを Web サイト レベルで実装する場合は、php.ini ファイルの auto_prepend および auto_append ディレクティブからこれらの関数を呼び出すことができます。この方法は効果的ですが、高負荷の Web サイトでは間違いなくより多くのオーバーヘッドが発生します。このクラスの使用方法の詳細については、そのソース コードを参照してください。ソースコードの説明は非常に完全で、著者はあなたが知る必要があるすべてを教えてくれます。
PHP 4.0.4 には新しい出力キャッシュ ハンドラー ob_gzhandler があり、前のクラスに似ていますが、使用方法が異なります。 ob_gzhandler を使用する場合は、次の内容を php.ini に追加する必要があります。
出力ハンドラー = ob_gzhandler;
このコード行により、PHP は出力キャッシュをアクティブにし、送信するすべてのものを圧縮します。何らかの理由で、このコード行を php.ini に追加したくない場合は、PHP ソース ファイルが配置されているディレクトリ内の .htaccess ファイルを使用して、デフォルトのサーバー動作 (圧縮なし) を変更することもできます。は次のとおりです。
php_value 出力ハンドラー ob_gzhandler
または、次のように PHP コードから呼び出します。 ob_start("ob_gzhandler");
出力キャッシュ ハンドルを使用する方法は確かに非常に効果的であり、サーバーに特別な負荷をかけません。ただし、Netscape Communicator では圧縮グラフィックのサポートが不十分であるため、すべてのユーザーが IE ブラウザを使用していることを保証できない限り、圧縮 JPEG および GIF グラフィックを無効にする必要があることに注意してください。一般に、この圧縮は他のすべてのファイルに対して機能しますが、特に特別なプラグインやデータ ビューアを使用する場合は、ブラウザごとに個別にテストすることをお勧めします。