ホームページ >バックエンド開発 >PHPチュートリアル >PHP でキャッシュを実装する方法と、パフォーマンスに最適なキャッシュ手法はどれですか?
キャッシュは、パフォーマンスを向上させ、サーバーの負荷を軽減し、ユーザー エクスペリエンスを向上させるために、最新の Web アプリケーションにおいて不可欠な技術です。キャッシュは、すぐにアクセスできるようにデータを一時的に保存することで、冗長なデータベース クエリや高価な計算を防ぐのに役立ちます。 PHP には、特定の使用例に応じて実装できるさまざまなキャッシュ戦略とテクニックがあります。
この記事では、さまざまな種類のキャッシュ手法、PHP でのキャッシュの実装方法、使用する推奨のキャッシュ戦略について説明します。
PHP アプリケーションで使用できるキャッシュ メカニズムには複数の種類があります。各タイプは特定の目的を果たし、アプリケーションのニーズに基づいて活用できます。
この手法には、頻繁にアクセスされるデータ (データベース クエリ、API 応答、計算結果など) をキャッシュして、再取得や再計算を行わずに再利用できるようにすることが含まれます。
ページ キャッシュには、ページのレンダリングされた HTML 出力全体が保存され、リクエストごとに PHP スクリプトを実行することなく、ユーザーに直接提供できます。これは、コンテンツの多い静的ページに特に役立ちます。
オペコード キャッシュはコンパイルされた PHP バイトコードをメモリに保存するため、リクエストごとに PHP スクリプトを解析するオーバーヘッドが軽減されます。これは通常、PHP ランタイム レベルで行われます。
これには、キャッシュされたデータをサーバーのファイル システムに保存することが含まれます。ファイルはディスクから直接書き込まれ、読み取られます。これはメモリ内キャッシュよりも遅くなりますが、大規模なデータ セットや永続性が必要な場合に便利です。
HTTP キャッシュは、同じリソースに対する繰り返しのリクエストを避けるために、HTTP 応答をサーバーまたはクライアント レベルで保存します。これには、Cache-Control や ETag などのキャッシュ ヘッダーが含まれます。
クエリ結果またはデータベース オブジェクトをキャッシュして、同じデータベース クエリの繰り返しを回避し、データベース サーバーの負荷を軽減します。
PHP で最も一般的に使用されるキャッシュ手法のいくつかを実装する方法を見てみましょう。
データをキャッシュ ファイルに書き込み、データベースに再度クエリを実行する前にキャッシュ ファイルが存在し、最新であるかどうかを確認することで、ファイルベースのキャッシュを簡単に実装できます。
ファイルベースのキャッシュの例:
<?php $cacheFile = 'cache/data_cache.txt'; $cacheTime = 3600; // 1 hour // Check if the cache file exists and is still valid if (file_exists($cacheFile) && (filemtime($cacheFile) + $cacheTime > time())) { // Cache is valid, use cached data $data = file_get_contents($cacheFile); } else { // Cache is expired or doesn't exist, fetch fresh data $data = fetchDataFromDatabase(); // Example function to fetch data // Save the fetched data to the cache file file_put_contents($cacheFile, $data); } echo $data; ?>
この手法は、小規模なアプリケーションやデータが頻繁に変更されない場合に効果的です。ただし、メモリ内キャッシュ手法よりも遅いため、大規模なデータ セットの場合は注意して使用する必要があります。
キャッシュを高速化するには、Memcached や Redis などのツールを使用してメモリ内キャッシュを使用できます。これらのツールは、データをメモリに保存することで高性能のキャッシュ レイヤーを提供し、ファイル システムから取得するよりもはるかに高速に取得できるようにします。
Redis と PHP Redis 拡張機能をインストールします:
Redis キャッシュの例:
<?php // Create a Redis instance $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // Connect to Redis server $cacheKey = 'user_data'; $cacheTime = 3600; // Cache for 1 hour // Check if the data is cached $data = $redis->get($cacheKey); if ($data === false) { // Data not in cache, fetch it from the database $data = fetchDataFromDatabase(); // Your function to fetch data // Cache the result for future requests $redis->setex($cacheKey, $cacheTime, $data); } echo $data; ?>
Redis と Memcached はどちらも非常に高速で、有効期限やキャッシュの無効化などの高度なキャッシュ機能をサポートしているため、パフォーマンスが重要な懸念事項であるアプリケーションにはこのアプローチを強くお勧めします。
特定のデータベース クエリが繰り返し実行されていることが判明した場合は、それらのクエリの結果をキャッシュできます。 MySQL や PostgreSQL などのほとんどの最新のデータベースにはクエリ キャッシュ メカニズムが組み込まれていますが、PHP でクエリを手動でキャッシュすることもできます。
データベースクエリキャッシュの例:
<?php $cacheKey = 'db_query_cache'; $cacheTime = 3600; // Cache for 1 hour // Check if the result of the query is already cached $queryResult = $redis->get($cacheKey); if ($queryResult === false) { // Query not cached, fetch it from the database $queryResult = fetchDataFromDatabase(); // Your DB query here // Cache the query result $redis->setex($cacheKey, $cacheTime, serialize($queryResult)); } else { // Unserialize cached result $queryResult = unserialize($queryResult); } echo json_encode($queryResult); ?>
このアプローチでは、毎回データベースにクエリを実行するのではなく、結果が Redis などのキャッシュ システムに保存され、必要に応じてそこから取得されます。これにより、データベース クエリの数が大幅に削減され、パフォーマンスが向上します。
OPcache は、PHP スクリプトのコンパイルされたバイトコードをメモリにキャッシュする組み込みの PHP 拡張機能です。コンパイルされたスクリプトをキャッシュすることで、OPcache はリクエストごとに PHP ファイルを解析する必要がなくなります。
OPcache を有効にするには:
opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000
<?php if (function_exists('opcache_get_status')) { var_dump(opcache_get_status()); } ?>
OPcache は、PHP スクリプトのコンパイルをスキップし、キャッシュされたバイトコードを直接実行することで応答時間を改善するため、処理が重い PHP アプリケーションに特に役立ちます。
Cache-Control、ETag、Last-Modified などの適切な HTTP ヘッダーを使用して、HTTP レベルでキャッシュを制御できます。これらのヘッダーは、ブラウザーと中間キャッシュにコンテンツをキャッシュする方法を指示します。
<?php $cacheFile = 'cache/data_cache.txt'; $cacheTime = 3600; // 1 hour // Check if the cache file exists and is still valid if (file_exists($cacheFile) && (filemtime($cacheFile) + $cacheTime > time())) { // Cache is valid, use cached data $data = file_get_contents($cacheFile); } else { // Cache is expired or doesn't exist, fetch fresh data $data = fetchDataFromDatabase(); // Example function to fetch data // Save the fetched data to the cache file file_put_contents($cacheFile, $data); } echo $data; ?>
これは、画像、CSS、JavaScript ファイルなどの静的リソースに特に役立ちます。
アプリケーションが静的コンテンツ (画像、ビデオなど) を提供する場合、キャッシュを Cloudflare や AWS CloudFront などの CDN にオフロードできます。これらのサービスは、世界中のエッジ ロケーションでコンテンツをキャッシュし、遅延を削減し、エンドユーザーの読み込み時間を短縮します。
キャッシュは、PHP アプリケーションのパフォーマンスとスケーラビリティを向上させる強力なツールです。ニーズに応じて、ファイル キャッシュ、メモリ内キャッシュ (Redis または Memcached)、クエリ キャッシュ、オペコードなどのさまざまなキャッシュ手法を選択できます。キャッシュ (OPcache)、および HTTPキャッシュ。
ほとんどの最新の PHP アプリケーションでは、オブジェクトまたはデータのキャッシュに Redis を使用し、オペコードのキャッシュに OPcache を使用すると、パフォーマンスに優れた利点が得られます。データの変更頻度やパフォーマンスの重要性など、特定のユースケースを常に考慮して、アプリケーションに最適なキャッシュ戦略を決定してください。
以上がPHP でキャッシュを実装する方法と、パフォーマンスに最適なキャッシュ手法はどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。