PHPixie Cache:PSR-6、PSR-16、およびいくつかの興味深い機能

画像 PSR-16標準への投票はまだ終わっておらず、 PHPixieはすでにそれをサポートしています。 キャッシュはすでに処理されているので、ここで驚くことはないように思えますが、記事を読んだ後、PHPixie Cacheで新しく便利なものが見つかることを願っています。 いつものように、記事の最後に、フレームワークなしでCacheを使用するための手順と、コンポーネントを拡張してプロジェクトを支援する方法に関する情報があります。







カスタマイズ



サポートされているドライバーをすぐに確認できます。 これまでのところ、 voidmemoryphpfilememcachedredisの 5つしかありません







// /assets/config/cache.php return [ //    'default' => [ //    'driver' => 'void' ], 'second' => [ //        'driver' => 'memory', /*  */ /** *    ,      *    DateInterval ( P1D  1 ). *   null,     */ 'defaultExpiry' => 10, /** *   1  1000,   *   .     . *   10,    1%   *    . */ 'cleanupProbability' => 10 ], 'third' => [ //   .php  'driver' => 'phpfile', //   /assets/cache 'path' => 'third', /*  */ 'defaultExpiry' => null, 'cleanupProbability' => 10 ], 'fourth' => [ // Memcached 'driver' => 'memcached', /** *        Memcached::addServers, *       ,    1211  1 */ 'servers' => [ ['127.0.0.1'] ], /*  */ 'defaultExpiry' => null ], 'fifth' => [ // Redis   Predis 'driver' => 'redis', //       Predis\Client 'connection' => array( 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379 ), /*  */ 'defaultExpiry' => null ] ];
      
      





使用する







PHPixieヘッダーにあるように、CacheはPSR-6と新しい簡易PSR-16をサポートします。これは、 PHPixie \ Cache \ Poolインターフェースの外観です。







 namespace PHPixie\Cache; use PHPixie\Cache\Pool\Prefixed; use Psr\Cache\CacheItemPoolInterface; use Psr\SimpleCache\CacheInterface; //   PSR-6  PSR-16 interface Pool extends CacheItemPoolInterface, CacheInterface { /** *  PSR-6 Item      * @param string $key * @param mixed $value * @return Item */ public function createItem($key, $value = null); /** *   Pool   . *    . * @param string $prefix * @return Prefixed */ public function prefixedPool($prefix); }
      
      





そして今、ユースケース自体:







 //    . $storage = $cache->storage('second'); // PSR-6 public function getFairies() { $item = $this->storage->getItem('fairies'); if (!$item->isHit()) { $fairies = $this->generateFairies(); $item->set($fairies); $item->expiresAfter(100); $this->storage->save($item); } return $item->get(); } // PSR-16 public function getFairies() { $fairies = $this->storage->get('fairies'); if($fairies === null) { $fairies = $this->buildFairies(); $this->storage->set('fairies', $fairies, 100); } return $fairies; }
      
      





ただし、これらのPSRのドキュメントはすでに完成しているため、ここでこれらのPSRを使用して作業を書き直すことは意味がありません。PHPStormを使用すると、すべてのプロンプトが表示されます。







興味深い機能



次に、PHPixie Cacheが他のライブラリとどのように異なるかについて説明します。







プレフィックスプール







アプリケーションの複数の部分が同じキャッシュに書き込まれると、衝突を避けるために、一意のキープレフィックスを作成する必要があります。 このコードを書いた頻度:







 $key = 'article-'.$id; $article = $cache->get($key);
      
      





同じエンティティがアプリケーションの異なる部分にキャッシュされる場合、常に同じプレフィックスを使用するか、このロジックを別のクラスに配置する必要があります。 PHPixie Cacheでは、この問題はプレフィックスプールによって解決されます。プレフィックスプールは、プレフィックスを自動的に追加することにより、リポジトリへのリクエストをプロキシします。







 $storage = $cache->storage('default'); $articlesPool = $storage->prefixedPool('article'); $articlesPool->set($article->id, $article->html()); //     $storage ->set('article.'.$article->id, $article->html());
      
      





既にご想像のとおり 、$ artsPoolはリポジトリと同じPHPixie \ Cache \ Poolインターフェイスを実装し、階層を作成することでプレフィックスを付けることもできます。 将来、多くの記事がある場合、このようなプレフィックスプールは、コードを書き換えずに実際の別のリポジトリに置き換えることができるため、これは便利です。 したがって、キーとプレフィックスの問題を完全に取り除くことができます。







PHPixie \キャッシュ自体もプールです







ほとんどのユーザーはキャッシュストレージを1つだけ持っている可能性が高いので、人生を単純化してみませんか?







 //  $cache->storage('default')->get('fairy'); //   $cache->get('fairy');
      
      





ファイルに保存するとき、キーはハッシュされません







ほとんどのライブラリは、キーハッシュを作成してファイル名を生成します。 これは、クラッカーでキーを設定することにした場合、エンコードの問題を回避するために行われますが、これは原則としてお勧めしません。 一方、このハッシュにはCPU時間を要するため、それを残す特別な理由はありません。 ただし、重要な人のために、この機能をパラメーターとして有効にするオプションを追加する計画があります。







ファイルキャッシュを最適化する







繰り返しになりますが、多くのライブラリはキャッシュファイル形式としてシリアル化を使用しています。 同時に、値自体とその有効期限がシリアル化されます。 2つの欠点があります。有効期限を確認するには、ファイル全体を読み取り、シリアル化解除する必要があります。また、シリアル化解除自体も大きな値に対して安価ではないという事実があります。 PHPixie \ Cacheは何をしますか? 作成されたファイルの例を見てみましょう。







 <?php /*1483041355*/ return array(1,2,3);
      
      





最初の行にはファイルの有効期限が含まれているため、その新鮮さを確認するには、ファイル全体ではなく、ファイルのみを読み取れば十分です。 さらに、ファイルからのデータはinclude



ステートメントによって取得されるため、ファイルのコードはopcacheに送られるため、数回連続してデータを取得すると、変更されるまで実際にディスクから読み取られません。 ちなみに、古いシリアル化アプローチもコンポーネントですぐに利用可能になります。







フレームワークなしで使用する



 $slice = new \PHPixie\Slice(); $filesystem = new \PHPixie\Filesystem(); $config = $slice->arrayData([ 'default' => [ 'driver' => 'memory' ] ]); // /tmp/cache    //      $root = $filesystem->root('/tmp/cache/'); $cache = new \PHPixie\Cache($config, $root); //         ,    $cache = new \PHPixie\Cache($config);
      
      





ご覧のとおり、必須の依存関係は1つしかないため、シンプルで理解しやすいキャッシュを探しているなら、気に入っていただければ幸いです。







Github: https : //github.com/phpixie/cache







ドライバーの追加



コミュニティが4つの新しいプロバイダーをPHPixie Socialに追加した後、パッケージにドライバーを追加する方法に関する小さなチェックリストを追加するときが来たと判断しました。







  1. \PHPixie\Cache\Drivers\Driver



    から継承するクラス\PHPixie\Cache\Drivers\Type\YourDriver



    作成します。
  2. \PHPixie\Cache\Builder::$driverMap



    ます。
  3. \PHPixie\Tests\Cache\Driver\YourDriverTest



    から継承してPHPixie\Tests\Cache\DriverTest



    を登録するテスト\PHPixie\Tests\Cache\Driver\YourDriverTest



    PHPixie\Tests\Cache\DriverTest



    します。
  4. 新しい依存関係がある場合は、 .travis.yml



    composer.json



    修正します。
  5. プルリクエストを送信;)


どちらかといえば、私たちは私たちのチャットの問題をいつでも喜んでお手伝いします。








All Articles