====== PSR-16: Common Interface for Caching Libraries ======
--- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-28//
本章は、若干の補足を加筆してはいるものの単に[[https://www.php-fig.org/psr/|PSRのサイト]]を日本語に翻訳したものに過ぎません。英語が堪能な方は原文をご参照下さい。翻訳に当たっては、基本的に機械翻訳を使い、理解できない部分は独断で意訳しております。拙い訳では御座いますが恥を忍んで投稿しておりますので、ご指摘など御座いましたらコメントを頂ければ幸いです。
関連記事
* [[psr:top|PSR - PHP標準勧告]]
* [[psr:psr1|PSR-1: Basic Coding Standard - 基本コーディング規約]]
* [[psr:psr3|PSR-3: Logger Interface - ロガーインターフェイス]]
* [[psr:psr4|PSR-4: Autoloading Standard - オートローディング規約]]
* [[psr:psr5|PSR-5: PHPDoc Standard(Draft) - PHPDoc規約]]
* [[psr:psr6|PSR-6: Caching Interface - キャッシングインターフェイス]]
* [[psr:psr7|PSR-7: HTTP Message Interface - HTTPメッセージインターフェイス]]
* [[psr:psr11|PSR-11: Container Interface - コンテナインターフェイス]]
* [[psr:psr12|PSR-12: Extended Coding Style - 拡張コーディングスタイル]]
* [[psr:psr13|PSR-13: Link definition interfaces - リンク定義インターフェース]]
* [[psr:psr14|PSR-14: Event Dispatcher - イベントディスパッチャー]]
* [[psr:psr15|PSR-15: HTTP Server Request Handlers - HTTPサーバーリクエストハンドラー]]
* PSR-16: Common Interface for Caching Libraries - キャッシングライブラリのための共通インターフェース
* [[psr:psr17|PSR-17: HTTP Factories - HTTPファクトリー]]
* [[psr:psr18|PSR-18: HTTP Client - HTTPクライアント]]
* [[psr:psr19|PSR-19: PHPDoc tags(Draft) - PHPDocタグ]]
-----
====== PSR-16: キャッシングライブラリのための共通インターフェース ======
--- // 原文より翻訳 [[https://www.php-fig.org/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'' は、 [[https://www.ietf.org/rfc/rfc2119.txt|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からコピーしました。
* **Calling Library** -- 実際にキャッシュサービスを必要とするライブラリまたはコード。このライブラリは、本規約のインターフェースを実装するキャッシングサービスを利用しますが、その他のキャッシングサービスの実装に関する知識は必要ありません。\\ \\
* **Implementing Library** -- Calling Library にキャッシングサービスを提供するために、このライブラリは本規約を実装する責任があります。Implementing Library は、Psr\SimpleCache\CacheInterface インターフェースを実装するクラスを提供する必要があります ( ''MUST'' )。Implementing Libraries では、1秒単位で 以下に説明するように、最小限のTTL (Time To Live) 機能をサポートする必要があります ( ''MUST'' )。\\ \\
* **TTL** -- アイテムの残存期間(TTL:Time To Live)は、そのアイテムが保存されてから古くなったと見なされるまでの時間のことです。TTL は通常、秒単位の時間を表す整数、または DateInterval オブジェクトによって定義されます。\\ \\
* **有効期限** -- アイテムが古くなったとに設定された実際の時間。 これは、オブジェクトが格納された時刻にTTLを加算することで計算されます。\\ \\ 300秒の TTL を持つアイテムが 1:30:00 に保存された時、その有効期限は 1:35:00 です。\\ \\ Implementing Library は、要求された有効期限の前にアイテムを期限切れにすることができます ( ''MAY'' )。ただし、有効期限に達したら、アイテムは期限切れとして扱う必要があります ( ''MUST'' )。Calling Library はアイテムの保存を要求しますが、有効期限を指定しない場合、または有効期限または TTL を null に指定した場合、Implementing Library は、構成されたデフォルトの期間を使用してもかまいません ( ''MAY'' )。 デフォルトの期間が設定されていない場合、Implementing Library は、それを、アイテムを永久に(または基本となる実装がサポートしている限りの間)キャッシュする要求として、それを解釈する必要があります ( ''MUST'' )。\\ \\ 負またはゼロのTTLが提供されている場合、アイテムは既に期限切れであるため、存在する場合はキャッシュから削除する必要があります( ''MUST'' )。\\ \\
* **キー** -- キャッシュされたアイテムを一意に識別する少なくとも1つの文字の文字列。Implementing Library は UTF-8 エンコードで最大 64 文字の長さで任意の順序の文字、''A 〜 Z''、''a 〜 z''、''0 〜 9''、アンダースコア(''_'')、およびピリオド(''.'') の文字で構成されるキーをサポートする必要があります ( ''MUST'' )。Implementing Library は、追加の文字とエンコーディング または より長い文字長をサポートする場合がありますが ( ''MAY'' )、少なくともその最小値をサポートしなければなりません( ''MUST'' )。ライブラリは、必要に応じてキー文字列の独自のエスケープに責任がありますが、変更されていない元のキー文字列を返すことができる必要があります ( ''MUST'' )。 次の文字は、将来の拡張のために予約されており、Implementing Library によってサポートしてはなりません ( ''MUST NOT'' ):''{}()/\@:'' \\ \\
* **キャッシュミス** -- キャッシュミスはnullを返すため、nullを格納したか否かは検出できません。これが、PSR-6の仮定から主として逸れている点です。
\\
===== 1.3 キャッシュ =====
特定のキャッシュアイテムにデフォルトのTTLが指定されていない場合に、実装は、ユーザーがデフォルトのTTLを指定するためのメカニズムを提供することがあります( ''MAY'' )。 ユーザー指定のデフォルトが提供されない場合、実装は、基本となる実装で許可されている最大の正当な値にデフォルト設定する必要があります( ''MUST'' )。 基本となる実装がTTLをサポートしない場合、ユーザーが指定したTTLは黙って無視されなければなりません( ''MUST'' )。
\\
===== 1.4 データ =====
Implementing library の実装は、以下を含むすべてのシリアライズ可能なPHPデータ型をサポートする必要があります (''MUST'')。
* **Strings** -- PHP互換エンコーディングの任意のサイズの文字列\\ \\
* **Integers** -- 符号付きの64ビットまでのPHPでサポートされている任意のサイズのすべての整数\\ \\
* **Floats** -- すべての符号付き浮動小数点値\\ \\
* **Boolean** -- TrueおよびFalse\\ \\
* Null - The null value (although it will not be distinguishable from a cache miss when reading it back out).\\ \\ **Null** -- null値(ただし、読み戻すときはキャッシュミスとは区別されません)\\ \\
* **Arrays** -- 添字配列、連想配列 および 任意の深さの多次元配列\\ \\
* **Object** -- ''$o == unserialize(serialize($o))'' のような、無損失性のシリアライゼーションとデシリアライゼーションをサポートするオブジェクト。オブジェクトは、PHPの Serializable インターフェース、''__sleep()'' または''__wakeup()'' マジックメソッド、または必要に応じて同様の言語機能を活用する場合があります(''MAY'')
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.
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 =====
\\
===== 2.3 InvalidArgumentException =====
\\