非常に同時のWebアプリケーションでは、頻繁にデータの読み取りと書き込みがパフォーマンスボトルネックになります。データベースへの圧力を軽減し、データアクセスをスピードアップするために、開発者はしばしば中間層としてキャッシュメカニズムを使用します。 APCUは、PHPで特に人気のある軽量メモリキャッシュソリューションです。 APCUが提供する多くのインターフェイスの中で、 APCU_Entry関数は、その原子性と利便性を備えた効率的なデータキャッシュ戦略を構築するための強力なツールになりました。
この記事では、 APCU_Entry関数を使用し、永続的なストレージ(データベースやファイルシステムなど)を組み合わせて、効率的で信頼できるデータアクセスソリューションを実現する方法を紹介します。
APCU_ENTRYは、PHP 5.5+で導入された便利な関数であり、キャッシュ値を取得しながらキャッシュを「バックフィル」するコールバック関数を定義できます。キャッシュに対応するキーがない場合、コールバック関数を自動的に呼び出してデータを生成し、キャッシュに書き込みます。
関数の署名は次のとおりです。
mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
$キー:キャッシュされたキー名。
$ジェネレーター:データの生成に使用されるコールバック関数。
$ TTL :キャッシュサバイバル時間(秒)、デフォルトが期限切れになることはありません。
従来のキャッシュ使用方法は「最初にキャッシュを確認し、次にデータベースを確認してください」です。プロセスは次のとおりです。
キャッシュがヒットするかどうかを照会します。
ヒットする場合は、直接返します。
見逃していない場合は、データベースからデータを読み取ります。
データを書き込み、キャッシュして返します。
APCU_Entryを使用して、上記のロジックを1つの行に圧縮できます。
$data = apcu_entry('user_42', function() {
return fetch_user_from_db(42);
}, 300);
上記のコードの意味は、キャッシュからuser_42を読んでみてください。そうでない場合は、 fetch_user_from_db(42)を実行してデータを取得し、300秒間キャッシュします。
ユーザー情報テーブルがあり、ユーザーデータをキャッシュする必要があるとします。
function fetch_user_from_db($id) {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
function get_user($id) {
return apcu_entry("user_$id", function() use ($id) {
return fetch_user_from_db($id);
}, 600); // キャッシュ 10 分
}
このモードには簡潔なコードがあるだけでなく、キャッシュの故障の問題を効果的に回避します。
一部のデータは外部APIから来ており、コールコストは高くなっています。たとえば、 https://api.gitbox.net/user/42からユーザー情報を入手してください。また、 APCU_Entryをキャッシュとして使用することもできます。
function fetch_user_from_api($id) {
$url = "https://api.gitbox.net/user/$id";
$response = file_get_contents($url);
return json_decode($response, true);
}
function get_user_from_api($id) {
return apcu_entry("api_user_$id", function() use ($id) {
return fetch_user_from_api($id);
}, 300); // キャッシュ 5 分
}
これにより、リモートAPIを呼び出す頻度を大幅に減らし、応答速度を向上させることができます。
共有メモリの制限:APCUのキャッシュデータはローカルメモリに保存され、異なるPHP-FPMプロセス間で共有されるため、 APC.Shm_Sizeで十分であることを確認してください。
ネイティブのみに適用できます:APCUはインプロセスキャッシュであり、マルチサーバー環境ではありません。 Redis、Memcachedなどの分散キャッシュと組み合わせて使用できます。
読み取りが増え、読み取りが少ないデータに適しています。APCUキャッシュは頻繁に更新されるデータにはお勧めしません。また、同期メカニズムを使用して、データの矛盾を防ぐ必要があります。
APCU_Entryを使用すると、Cachesを優雅に組み合わせてデータベースやAPIなどの永続的なストレージを組み合わせて、簡潔で効率的で誤りのあるコードを記述できます。その原子性と怠zyな負荷特性は、開発プロセスを簡素化するだけでなく、システムの保守性を向上させます。
データベースクエリの結果でローカルにキャッシュされている場合でも、リモートAPIへのアクセスの頻度を減らすかどうかにかかわらず、 APCU_Entryは推奨される実用的なソリューションです。これは、パフォーマンスの最適化を追求するPHPプロジェクトの不可欠な部分です。