The Cache Component

The Cache component provides features covering simple to advanced caching needs. It natively implements PSR-6 and the Cache Contracts for greatest interoperability. It is designed for performance and resiliency, ships with ready to use adapters for the most common caching backends. It enables tag-based invalidation and cache stampede protection via locking and early expiration.

キャッシュ コンポーネントは、単純なキャッシング ニーズから高度なキャッシング ニーズまでカバーする機能を提供します。最大の相互運用性のために、PSR-6 とキャッシュ コントラクトをネイティブに実装します。パフォーマンスと回復力を考慮して設計されており、最も一般的なキャッシュ バックエンド用のアダプターをすぐに使用できる状態で出荷されます。ロックと早期有効期限により、タグベースの無効化とキャッシュ スタンピード保護を有効にします。

Tip

ヒント

The component also contains adapters to convert between PSR-6 and PSR-16. See Adapters For Interoperability between PSR-6 and PSR-16 Cache.

このコンポーネントには、PSR-6 と PSR-16 の間で変換するアダプターも含まれています。PSR-6 と PSR-16 キャッシュ間の相互運用性については、アダプターを参照してください。

Installation

1
$ composer require symfony/cache

Note

ノート

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

このコンポーネントを Symfony アプリケーションの外部にインストールする場合は、Composer が提供するクラス自動ロード メカニズムを有効にするために、コード内に vendor/autoload.php ファイルを必要とする必要があります。詳細については、この記事をお読みください。

Cache Contracts versus PSR-6

This component includes two different approaches to caching:

このコンポーネントには、キャッシングに対する 2 つの異なるアプローチが含まれています。
PSR-6 Caching:
A generic cache system, which involves cache "pools" and cache "items".
キャッシュ「プール」とキャッシュ「アイテム」を含む汎用キャッシュ システム。
Cache Contracts:
A simpler yet more powerful way to cache values based on recomputation callbacks.
再計算コールバックに基づいて値をキャッシュする、よりシンプルかつ強力な方法です。

Tip

ヒント

Using the Cache Contracts approach is recommended: it requires less code boilerplate and provides cache stampede protection by default.

キャッシュ コントラクト アプローチを使用することをお勧めします。必要なコードのボイラープレートが少なくなり、デフォルトでキャッシュ スタンピード保護が提供されます。

Cache Contracts

All adapters support the Cache Contracts. They contain only two methods: get() and delete(). There's no set() method because the get() method both gets and sets the cache values.

すべてのアダプターがキャッシュ コントラクトをサポートします。これらには、get() と delete() の 2 つのメソッドしか含まれていません。 get() メソッドはキャッシュ値の取得と設定の両方を行うため、set() メソッドはありません。

The first thing you need is to instantiate a cache adapter. The FilesystemAdapter is used in this example:

最初に必要なことは、キャッシュ アダプターをインスタンス化することです。この例では、FilesystemAdapter が使用されています。
1
2
3
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$cache = new FilesystemAdapter();

Now you can retrieve and delete cached data using this object. The first argument of the get() method is a key, an arbitrary string that you associate to the cached value so you can retrieve it later. The second argument is a PHP callable which is executed when the key is not found in the cache to generate and return the value:

このオブジェクトを使用して、キャッシュされたデータを取得および削除できるようになりました。 get() メソッドの最初の引数はキーであり、後で取得できるようにキャッシュされた値に関連付ける任意の文字列です。 2 番目の引数は、キーがキャッシュに見つからない場合に実行され、値を生成して返す PHP 呼び出し可能オブジェクトです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Contracts\Cache\ItemInterface;

// The callable will only be executed on a cache miss.
$value = $cache->get('my_cache_key', function (ItemInterface $item) {
    $item->expiresAfter(3600);

    // ... do some HTTP request or heavy computations
    $computedValue = 'foobar';

    return $computedValue;
});

echo $value; // 'foobar'

// ... and to remove the cache key
$cache->delete('my_cache_key');

Note

ノート

Use cache tags to delete more than one key at the time. Read more at Cache Invalidation.

一度に複数のキーを削除するには、キャッシュ タグを使用します。続きを読む atCache の無効化。

Stampede Prevention

The Cache Contracts also come with built in Stampede prevention. This will remove CPU spikes at the moments when the cache is cold. If an example application spends 5 seconds to compute data that is cached for 1 hour and this data is accessed 10 times every second, this means that you mostly have cache hits and everything is fine. But after 1 hour, we get 10 new requests to a cold cache. So the data is computed again. The next second the same thing happens. So the data is computed about 50 times before the cache is warm again. This is where you need stampede prevention.

キャッシュ コントラクトには、スタンピード防止機能も組み込まれています。これにより、キャッシュが冷えている瞬間の CPU スパイクが取り除かれます。サンプル アプリケーションが、1 時間キャッシュされたデータの計算に 5 秒を費やし、このデータが毎秒 10 回アクセスされる場合、これはほとんどキャッシュ ヒットがあり、すべて問題がないことを意味します。しかし、1 時間後、コールド キャッシュへの 10 個の新しいリクエストを受け取ります。そのため、データが再計算されます。次の秒も同じことが起こります。そのため、キャッシュが再びウォームアップする前に、データは約 50 回計算されます。これは、スタンピング防止が必要な場所です。

The first solution is to use locking: only allow one PHP process (on a per-host basis) to compute a specific key at a time. Locking is built-in by default, so you don't need to do anything beyond leveraging the Cache Contracts.

最初の解決策は、ロックを使用することです。一度に 1 つの PHP プロセス (ホストごとに) だけが特定のキーを計算できるようにします。ロックはデフォルトで組み込まれているため、キャッシュ コントラクトを活用する以外に何もする必要はありません。

The second solution is also built-in when using the Cache Contracts: instead of waiting for the full delay before expiring a value, recompute it ahead of its expiration date. The Probabilistic early expiration algorithm randomly fakes a cache miss for one user while others are still served the cached value. You can control its behavior with the third optional parameter of get(), which is a float value called "beta".

キャッシュ コントラクトを使用する場合、2 番目のソリューションも組み込まれています。値が期限切れになる前に完全な遅延を待つ代わりに、有効期限の前に値を再計算します。確率的早期有効期限アルゴリズムは、1 人のユーザーのキャッシュ ミスをランダムに偽装し、他のユーザーにはキャッシュされた値が引き続き提供されます。 get() の 3 番目のオプション パラメータでその動作を制御できます。これは「ベータ」と呼ばれる浮動小数点値です。

By default the beta is 1.0 and higher values mean earlier recompute. Set it to 0 to disable early recompute and set it to INF to force an immediate recompute:

デフォルトのベータは 1.0 で、値が大きいほど再計算が早くなります。初期再計算を無効にするには 0 に設定し、即時再計算を強制するには INF に設定します。
1
2
3
4
5
6
7
8
9
use Symfony\Contracts\Cache\ItemInterface;

$beta = 1.0;
$value = $cache->get('my_cache_key', function (ItemInterface $item) {
    $item->expiresAfter(3600);
    $item->tag(['tag_0', 'tag_1']);

    return '...';
}, $beta);

Available Cache Adapters

The following cache adapters are available:

次のキャッシュ アダプタを使用できます。

Generic Caching (PSR-6)

To use the generic PSR-6 Caching abilities, you'll need to learn its key concepts:

一般的な PSR-6 キャッシング機能を使用するには、その主要な概念を学ぶ必要があります。
Item
A single unit of information stored as a key/value pair, where the key is the unique identifier of the information and the value is its contents; see the Cache Items article for more details.
キーと値のペアとして保存される情報の 1 つの単位。キーは情報の一意の識別子であり、値はその内容です。詳細については、キャッシュ アイテムの記事を参照してください。
Pool
A logical repository of cache items. All cache operations (saving items, looking for items, etc.) are performed through the pool. Applications can define as many pools as needed.
キャッシュ アイテムの論理リポジトリ。すべてのキャッシュ操作 (アイテムの保存、アイテムの検索など) は、プールを通じて実行されます。アプリケーションは、必要な数のプールを定義できます。
Adapter
It implements the actual caching mechanism to store the information in the filesystem, in a database, etc. The component provides several ready to use adapters for common caching backends (Redis, APCu, PDO, etc.)
ファイルシステムやデータベースなどに情報を保存するための実際のキャッシュメカニズムを実装します。このコンポーネントは、一般的なキャッシュバックエンド (Redis、APCu、PDO など) 用にすぐに使用できるアダプターをいくつか提供します。

Basic Usage (PSR-6)

This part of the component is an implementation of PSR-6, which means that its basic API is the same as defined in the document. Before starting to cache information, create the cache pool using any of the built-in adapters. For example, to create a filesystem-based cache, instantiate FilesystemAdapter:

コンポーネントのこの部分は PSR-6 の実装です。つまり、その基本的な API はドキュメントで定義されているものと同じです。情報のキャッシュを開始する前に、組み込みアダプターのいずれかを使用してキャッシュ プールを作成します。たとえば、ファイル システム ベースのキャッシュを作成するには、FilesystemAdapter をインスタンス化します。
1
2
3
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$cache = new FilesystemAdapter();

Now you can create, retrieve, update and delete items using this cache pool:

このキャッシュ プールを使用してアイテムを作成、取得、更新、および削除できるようになりました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// create a new item by trying to get it from the cache
$productsCount = $cache->getItem('stats.products_count');

// assign a value to the item and save it
$productsCount->set(4711);
$cache->save($productsCount);

// retrieve the cache item
$productsCount = $cache->getItem('stats.products_count');
if (!$productsCount->isHit()) {
    // ... item does not exist in the cache
}
// retrieve the value stored by the item
$total = $productsCount->get();

// remove the cache item
$cache->deleteItem('stats.products_count');

For a list of all of the supported adapters, see Cache Pools and Supported Adapters.

サポートされているすべてのアダプターのリストについては、「キャッシュ プールとサポートされているアダプター」を参照してください。

Marshalling (Serializing) Data

Note

ノート

Marshalling and serializing are similar concepts. Serializing is the process of translating an object state into a format that can be stored (e.g. in a file). Marshalling is the process of translating both the object state and its codebase into a format that can be stored or transmitted.

マーシャリングとシリアライズは同様の概念です。シリアル化とは、オブジェクトの状態を保存可能な形式 (ファイルなど) に変換するプロセスです。マーシャリングとは、objectstate とそのコードベースの両方を、保存または送信できる形式に変換するプロセスです。

Unmarshalling an object produces a copy of the original object, possibly by automatically loading the class definitions of the object.

オブジェクトをアンマーシャリングすると、元のオブジェクトのコピーが生成されます。おそらく、オブジェクトのクラス定義が自動的に読み込まれます。

Symfony uses marshallers (classes which implement MarshallerInterface) to process the cache items before storing them.

symfony はマーシャラー (MarshallerInterface を実装するクラス) を使用して、キャッシュアイテムを保存する前に処理します。

The DefaultMarshaller uses PHP's serialize() or igbinary_serialize() if the Igbinary extension is installed. There are other marshallers that can encrypt or compress the data before storing it:

Igbinary 拡張機能がインストールされている場合、DefaultMarshaller は PHP の sserialize() または igbinary_serialize() を使用します。データを保存する前に暗号化または圧縮できる他のマーシャラーがあります。
1
2
3
4
5
6
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\DefaultMarshaller;
use Symfony\Component\Cache\DeflateMarshaller;

$marshaller = new DeflateMarshaller(new DefaultMarshaller());
$cache = new RedisAdapter(new \Redis(), 'namespace', 0, $marshaller);

Advanced Usage