目次

PSR-16: Common Interface for Caching Libraries

y2sunlight 2020-07-28

本章は、若干の補足を加筆してはいるものの単にPSRのサイトを日本語に翻訳したものに過ぎません。英語が堪能な方は原文をご参照下さい。翻訳に当たっては、基本的に機械翻訳を使い、理解できない部分は独断で意訳しております。拙い訳では御座いますが恥を忍んで投稿しておりますので、ご指摘など御座いましたらコメントを頂ければ幸いです。

関連記事


PSR-16: キャッシングライブラリのための共通インターフェース

原文より翻訳 PSR-16: Common Interface for Caching Libraries 2020-08-04 現在

このドキュメントでは、キャッシュアイテムとキャッシュドライバーのシンプルで拡張可能なインターフェースについて説明します。

このドキュメントのキーワード MUST , MUST NOT , REQUIRED , SHALL , SHALL NOT , SHOULD , SHOULD NOT , RECOMMENDED , MAY 及び OPTIONAL は、 RFC 2119で説明されているように解釈して下さい。

RFC 2119の説明
MUST, REQUIRED, SHALL — 絶対必要
MUST NOT, SHALL NOT — 絶対禁止
SHOULD, RECOMMENDED — 推奨(但し、無視できる特定の正当な理由が存在するかもしれない)
SHOULD NOT — 推奨できない(但し、許可できる特定の正当な理由が存在するかもしれない)
MAY, OPTIONAL — オプション

最終的な実装は、提案されたものよりも多くの機能でオブジェクトを装飾してもよい( MAY )が、指定されたインターフェース/機能を最初に実装しなければならない( MUST )。


1.1 はじめに

キャッシングは、プロジェクトのパフォーマンスを向上させる一般的な方法であり、キャッシングライブラリは、多くのフレームワークとライブラリの最も一般的な機能の1つになっています。このレベルの相互運用性は、ライブラリが独自のキャッシング実装を止め、フレームワークから提供された実装または別の専用キャッシュライブラリに簡単に依存できることを意味します。

PSR-6はこの問題をすでに解決していますが、最も簡単なユースケースに必要なものについては、かなり形式的で冗長な方法で行われています。このより簡単なアプローチは、一般的なケースのために、標準化され、また合理化されたインターフェースの構築を目的としています。これは、PSR-6とは独立していますが、PSR-6との互換性をできるだけ簡単にするように設計されています。


1.2 定義

ライブラリの呼び出し(Calling Library)、ライブラリの実装(Implementing Library)、TTL、有効期限、キーの定義は、同じ仮定が当てはまるため、PSR-6からコピーしました。


1.3 キャッシュ

特定のキャッシュアイテムにデフォルトのTTLが指定されていない場合に、実装は、ユーザーがデフォルトのTTLを指定するためのメカニズムを提供することがあります( MAY )。 ユーザー指定のデフォルトが提供されない場合、実装は、基本となる実装で許可されている最大の正当な値にデフォルト設定する必要があります( MUST )。 基本となる実装がTTLをサポートしない場合、ユーザーが指定したTTLは黙って無視されなければなりません( MUST )。


1.4 データ

Implementing library の実装は、以下を含むすべてのシリアライズ可能なPHPデータ型をサポートする必要があります (MUST)。

Implementing Library に渡されるすべてのデータは、渡されたとおりに返される必要があります ( MUST )。それには変数の型も含まれます。つまり、(int)5 が保存された値である場合、(string)5 を返すのはエラーです。ライブラリの実装では、PHPのserialize() / unserialize() 関数を内部で使用できますが ( MAY )、必須ではありません。それらとの互換性は、許すことができるオブジェクト値の基準として単に使用されます。

なんらかの理由で正確に保存された値を返すことができない場合、Implementing library は、破損したデータではなくキャッシュミスで応答する必要があります ( MUST )。


2.1 CacheInterface

キャッシュインターフェースは、キャッシュエントリのコレクションに対する最も基本的な操作を定義します。これには、個々のキャッシュアイテムの基本的な読み取り、書き込み、削除が伴います。

さらに、キャッシュエントリの複数のセットを処理するメソッドがあります。これらには、一度に複数のキャッシュエントリの書き込み、読み取り、削除などがあります。これは、実行するキャッシュの読み取り/書き込みが多い場合に役立ち、キャッシュサーバーへの1回の呼び出しで操作を実行し、待ち時間を大幅に短縮できます。

CacheInterfaceのインスタンスは、キャッシュアイテムの単一のコレクションに対応し、それは、単一のキー名前空間を持っています。またそれは、PSR-6の「プール」に相当します。異なるCacheInterfaceのインスタンスは同じデータストアによってサポートされる場合がありますが( MAY )、論理的に独立している必要があります( MUST )。

上記の原文
An instance of CacheInterface corresponds to a single collection of cache items with a single key namespace, and is equivalent to a “Pool” in PSR-6. Different CacheInterface instances MAY be backed by the same datastore, but MUST be logically independent.
CacheInterface.php
<?php
 
namespace Psr\SimpleCache;
 
interface CacheInterface
{
    /**
     * Fetches a value from the cache.
     * キャッシュから値をフェッチします。
     *
     * @param string $key     The unique key of this item in the cache.
     *                        キャッシュ内のこのアイテムのユニークキー。
     * @param mixed  $default Default value to return if the key does not exist.
     *                        キーが存在しない場合に返すデフォルト値。
     *
     * @return mixed The value of the item from the cache, or $default in case of cache miss.
     *               キャッシュからのアイテムの値、またはキャッシュミスの場合は $default。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if the $key string is not a legal value.
     *   $key正当な値でない場合にスローする必要があります(MUST)。
     */
    public function get($key, $default = null);
 
    /**
     * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time.
     * オプションの有効期限(TTL)を持つキーによって一意に参照されるデータをキャッシュに永続化します。
     *
     * @param string                $key   The key of the item to store.
     *                                     保存するアイテムのキー。
     * @param mixed                 $value The value of the item to store. Must be serializable.
     *                                     保存するアイテムの値。シリアル化可能でなければなりません。
     * @param null|int|\DateInterval $ttl   Optional. The TTL value of this item. If no value is sent and
     *                                     the driver supports TTL then the library may set a default 
     *                                     value for it or let the driver take care of that.
     *                                     オプション。このアイテムのTTL値。値が送信されず、
     *                                     ドライバーがTTLをサポートしている場合、ライブラリーは
     *                                     TTLのデフォルト値を設定するか、ドライバーにそれを
     *                                     処理させることができます。
     *
     * @return bool True on success and false on failure.
     *              成功した場合は true、失敗した場合は false。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if the $key string is not a legal value.
     *   $keyが正当な値でない場合にスローする必要があります(MUST)。
     */
    public function set($key, $value, $ttl = null);
 
    /**
     * Delete an item from the cache by its unique key.
     * ユニークキーによってアイテムをキャッシュから削除します。
     *
     * @param string $key The unique cache key of the item to delete.
     *                    削除するアイテムの一意のキャッシュキー。
     *
     * @return bool True if the item was successfully removed. False if there was an error.
     *              アイテムが正常に削除された場合は true。エラーがあった場合は false。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if the $key string is not a legal value.
     *   $keyが正当な値でない場合にスローする必要があります(MUST)。
     */
    public function delete($key);
 
    /**
     * Wipes clean the entire cache's keys.
     * キャッシュ全体のキーをきれいに消去します。
     *
     * @return bool True on success and false on failure.
     *              成功した場合は true、失敗した場合は false。
     */
    public function clear();
 
    /**
     * Obtains multiple cache items by their unique keys.
     * ユニークキーで複数のキャッシュアイテムを取得します。
     *
     * @param iterable $keys    A list of keys that can obtained in a single operation.
     *                          1回の操作で取得できるキーのリスト。
     * @param mixed    $default Default value to return for keys that do not exist.
     *                          存在しないキーに対して返すデフォルト値。
     *
     * @return iterable A list of key => value pairs. 
     *                  Cache keys that do not exist or are stale will have $default as value.
     *                  「キー => 値」のペアのリスト。
     *                  存在しないか古くなっているキャッシュキーは、値として $defaultを持ちます。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if $keys is neither an array nor a Traversable,
     *   or if any of the $keys are not a legal value.
     *   $keysが配列でも Traversableでもない場合、または $keysのいずれかが正当な値でない場合に
     *   スローする必要があります(MUST)。
     */
    public function getMultiple($keys, $default = null);
 
    /**
     * Persists a set of key => value pairs in the cache, with an optional TTL.
     * オプションのTTLを使用して、「キー => 値」のペアのセットをキャッシュに永続化します。
     *
     * @param iterable               $values A list of key => value pairs for a multiple-set operation.
     *                                       複数セット操作の「キー => 値」ペアのリスト。
     * @param null|int|\DateInterval $ttl    Optional. The TTL value of this item. If no value is sent 
     *                                       and the driver supports TTL then the library may set a default 
     *                                       value for it or let the driver take care of that.
     *                                       オプション。このアイテムのTTL値。値が送信されず、
     *                                       ドライバーがTTLをサポートしている場合、ライブラリーは
     *                                       TTLのデフォルト値を設定するか、ドライバーにそれを
     *                                       処理させることができます。
     *
     * @return bool True on success and false on failure.
     *              成功した場合は true、失敗した場合は false。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if $values is neither an array nor a Traversable,
     *   or if any of the $values are not a legal value.
     *   $valuesが配列でも Traversableでもない場合、または $valuesのいずれかが正当な値でない場合に
     *   スローする必要があります(MUST)。
     */
    public function setMultiple($values, $ttl = null);
 
    /**
     * Deletes multiple cache items in a single operation.
     * 1回の操作で複数のキャッシュアイテムを削除します。
     *
     * @param iterable $keys A list of string-based keys to be deleted.
     *                       削除する文字列ベースのキーのリスト。
     *
     * @return bool True if the items were successfully removed. False if there was an error.
     *              アイテムが正常に削除された場合は true。エラーがあった場合は false。
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if $keys is neither an array nor a Traversable,
     *   or if any of the $keys are not a legal value.
     *   $keysが配列でも Traversableでもない場合、または $keysのいずれかが正当な値でない場合に
     *  スローする必要があります(MUST)。
     */
    public function deleteMultiple($keys);
 
 
    /**
     * Determines whether an item is present in the cache.
     * アイテムがキャッシュに存在するかどうかを決定します。
     *
     * NOTE: It is recommended that has() is only to be used for cache warming type purposes
     * and not to be used within your live applications operations for get/set, as this method
     * is subject to a race condition where your has() will return true and immediately after,
     * another script can remove it, making the state of your app out of date.
     * 注:has()は、キャッシュウォーミング的な目的でのみ使用し、get/setの本番のアプリケーション
     * 操作内では使用しないことをお勧めします。なぜなら、このメソッドは、競合状態の影響を受けるためで、
     * has()が trueを返し、直後に、別のスクリプトがそれを削除して、アプリの状態を古くする可能性が
     * あるからです。
     *
     * @param string $key The cache item key.
     *                    キャッシュアイテムのキー。
     *
     * @return bool
     *
     * @throws \Psr\SimpleCache\InvalidArgumentException
     *   MUST be thrown if the $key string is not a legal value.
     *   $keyが正当な値でない場合にスローする必要があります(MUST)。
     */
    public function has($key);
}


2.2 CacheException

CacheException.php
<?php
 
namespace Psr\SimpleCache;
 
/**
 * Interface used for all types of exceptions thrown by the implementing library.
 * 実装ライブラリによってスローされるすべてのタイプの例外に使用されるインターフェース。
 */
interface CacheException
{
}


2.3 InvalidArgumentException

InvalidArgumentException.php
<?php
 
namespace Psr\SimpleCache;
 
/**
 * Exception interface for invalid cache arguments.
 * 無効なキャッシュ引数の例外インターフェース。
 *
 * When an invalid argument is passed, it must throw an exception which implements
 * this interface.
 * 無効な引数が渡された場合、このインターフェースを実装する例外をスローする必要があります。
 */
interface InvalidArgumentException extends CacheException
{
}