Yii-キャッシング

キャッシングは、アプリケーションのパフォーマンスを向上させる効果的な方法です。キャッシュメカニズムは静的データをキャッシュに保存し、要求されたときにキャッシュから取得します。サーバー側では、キャッシュを使用して、最新ニュースのリストなどの基本データを保存できます。ページフラグメントまたはWebページ全体を保存することもできます。クライアント側では、HTTPキャッシュを使用して、最近アクセスしたページをブラウザのキャッシュに保持できます。

DBの準備

Step 1−新しいデータベースを作成します。データベースは以下の2つの方法で作成できます。

  • ターミナルでmysql-u root –pを実行します

  • CREATE DATABASE helloworld CHARACTER SET utf8 COLLATEutf8_general_ciを使用して新しいデータベースを作成します

Step 2 −でデータベース接続を構成します config/db.phpファイル。次の構成は、現在使用されているシステム用です。

<?php
   return [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=localhost;dbname=helloworld',
      'username' => 'vladimir',
      'password' => '12345',
      'charset' => 'utf8',
   ];
?>

Step 3 −ルートフォルダ内 run ./yii migrate/create test_table。このコマンドは、DBを管理するためのデータベース移行を作成します。移行ファイルはに表示されますmigrations プロジェクトルートのフォルダ。

Step 4 −移行ファイルを変更します(m160106_163154_test_table.php この場合)このように。

<?php
   use yii\db\Schema;
   use yii\db\Migration;
   class m160106_163154_test_table extends Migration {
      public function safeUp()\ {
         $this->createTable("user", [
            "id" => Schema::TYPE_PK,
            "name" => Schema::TYPE_STRING,
            "email" => Schema::TYPE_STRING,
         ]);
         $this->batchInsert("user", ["name", "email"], [
            ["User1", "[email protected]"],
            ["User2", "[email protected]"],
            ["User3", "[email protected]"],
            ["User4", "[email protected]"],
            ["User5", "[email protected]"],
            ["User6", "[email protected]"],
            ["User7", "[email protected]"],
            ["User8", "[email protected]"],
            ["User9", "[email protected]"],
            ["User10", "[email protected]"],
            ["User11", "[email protected]"],
         ]);
      }
      public function safeDown() {
         $this->dropTable('user');
      }
   }
?>

上記の移行により、 user次のフィールドを持つテーブル:id、name、およびemail。また、いくつかのデモユーザーを追加します。

Step 5 −プロジェクトルート内 run ./yii migrate 移行をデータベースに適用します。

Step 6 −次に、モデルを作成する必要があります。 userテーブル。簡単にするために、Giiコード生成ツール。これを開くurl: http://localhost:8080/index.php?r=gii。次に、「モデルジェネレータ」ヘッダーの下にある「開始」ボタンをクリックします。テーブル名(「ユーザー」)とモデルクラス(「MyUser」)を入力し、「プレビュー」ボタンをクリックして、最後に「生成」ボタンをクリックします。

MyUserモデルがmodelsディレクトリに表示されます。

データキャッシング

データキャッシュは、PHP変数をキャッシュに保存し、後で取得するのに役立ちます。データキャッシングは、通常アプリケーションコンポーネントとして登録されているキャッシュコンポーネントに依存しています。アプリケーションコンポーネントにアクセスするには、Yii::$app → cache。複数のキャッシュアプ​​リケーションコンポーネントを登録できます。

Yiiは次のキャッシュストレージをサポートしています-

  • yii \ caching \ DbCache-データベーステーブルを使用してキャッシュされたデータを保存します。Uouは、yii \ caching \ DbCache :: $ cacheTableで指定されているようにテーブルを作成する必要があります。

  • yii \ caching \ ApcCache - PHPAPC拡張機能を使用します。

  • yii \ cacheing \ FileCache-ファイルを使用してキャッシュされたデータを保存します。

  • yii \ caching \ DummyCache-実際のキャッシュを行わないキャッシュプレースホルダーとして機能します。このコンポーネントの目的は、キャッシュの可用性をチェックする必要があるコードを単純化することです。

  • yii \ cacheing \ MemCache -PHPのmemcache拡張機能を使用します。

  • yii \ cacheing \ WinCache -PHPWinCache拡張機能を使用します。

  • yii \ redis \ Cache -Redisデータベースに基づいてキャッシュコンポーネントを実装します。

  • yii \ cacheing \ XCache -PHPXCache拡張機能を使用します。

すべてのキャッシュコンポーネントは、次のAPIをサポートしています-

  • get() -指定されたキーを使用してキャッシュからデータ値を取得します。データ値が期限切れ/無効であるか、見つからない場合は、false値が返されます。

  • add() -キーがキャッシュに見つからない場合、キーによって識別されるデータ値をキャッシュに格納します。

  • set() -キーで識別されるデータ値をキャッシュに格納します。

  • multiGet() -指定されたキーを使用してキャッシュから複数のデータ値を取得します。

  • multiAdd() -複数のデータ値をキャッシュに格納します。各アイテムはキーで識別されます。キーがすでにキャッシュに存在する場合、データ値はスキップされます。

  • multiSet() -複数のデータ値をキャッシュに格納します。各アイテムはキーで識別されます。

  • exists() -指定されたキーがキャッシュ内にあるかどうかを示す値を返します。

  • flush() -キャッシュからすべてのデータ値を削除します。

  • delete() -キーで識別されるデータ値をキャッシュから削除します。

キャッシュに保存されたデータ値は、削除されない限り、永久にそこに残ります。この動作を変更するには、set()メソッドを呼び出してデータ値を格納するときに有効期限パラメーターを設定できます。

キャッシュされたデータ値は、の変更によって無効にすることもできます。 cache dependencies

  • yii \ caching \ DbDependency-指定されたSQLステートメントのクエリ結果が変更されると、依存関係が変更されます。

  • yii \ caching \ ChainedDependency-チェーンの依存関係のいずれかが変更されると、依存関係が変更されます。

  • yii \ cacheing \ FileDependency-ファイルの最終変更時刻が変更されると、依存関係が変更されます。

  • yii \ caching \ ExpressionDependency-指定されたPHP式の結果が変更されると、依存関係が変更されます。

ここで、 cache アプリケーションへのアプリケーションコンポーネント。

Step 1 −を変更します config/web.php ファイル。

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
         ],
         'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
               [
                  'class' => 'yii\log\FileTarget',
                  'levels' => ['error', 'warning'],
               ],
            ],
         ],
         'db' => require(__DIR__ . '/db.php'),
      ],
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

Step 2 −という新しい関数を追加します actionTestCache() SiteControllerに。

public function actionTestCache() {
   $cache = Yii::$app->cache;
   // try retrieving $data from cache
   $data = $cache->get("my_cached_data");
   if ($data === false) {
      // $data is not found in cache, calculate it from scratch
      $data = date("d.m.Y H:i:s");
      // store $data in cache so that it can be retrieved next time
      $cache->set("my_cached_data", $data, 30);
   }
   // $data is available here
   var_dump($data);
}

Step 3 −タイプ http://localhost:8080/index.php?r=site/test-cache Webブラウザのアドレスバーに次のように表示されます。

Step 4−ページをリロードすると、日付が変更されていないことに気付くはずです。日付値がキャッシュされ、キャッシュは30秒以内に期限切れになります。30秒後にページをリロードします。

クエリキャッシュ

クエリキャッシュは、データベースクエリの結果をキャッシュします。クエリキャッシュには、DB接続とキャッシュアプ​​リケーションコンポーネントが必要です。

Step 1 −という新しいメソッドを追加します actionQueryCaching() SiteControllerに。

public function actionQueryCaching() {
   $duration = 10;
   $result = MyUser::getDb()->cache(function ($db) {
      return MyUser::find()->count();
   }, $duration);
   var_dump($result);
   $user = new MyUser();
   $user->name = "cached user name";
   $user->email = "[email protected]";
   $user->save();
   echo "==========";
   var_dump(MyUser::find()->count());
}

上記のコードでは、データベースクエリをキャッシュし、新しいユーザーを追加して、ユーザー数を表示します。

Step 2 −URLに移動します http://localhost:8080/index.php?r=site/query-caching ページをリロードします。

最初のページを開くと、DBクエリがキャッシュされ、すべてのユーザー数が表示されます。ページをリロードすると、キャッシュされたDBクエリの結果は、データベースクエリがキャッシュされているためと同じになります。

次のコマンドを使用して、コンソールからキャッシュをフラッシュできます-

  • yii cache −使用可能なキャッシュコンポーネントを表示します。

  • yii cache/flush cache1 cache2 cache3 −キャッシュコンポーネントcache1、cache2、およびcache3をフラッシュします。

  • yii cache/flush-all −すべてのキャッシュコンポーネントをフラッシュします。

Step 3 −アプリケーション実行のプロジェクトルート内 ./yii cache/flush-all