Yii-caching

提供:Dev Guides
移動先:案内検索

Yii-キャッシング

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

DBの準備

  • ステップ1 *-新しいデータベースを作成します。 データベースは、次の2つの方法で準備できます。
  • ターミナルで_mysql -u root –p_を実行します

. * _CREATE DATABASE helloworld CHARACTER SET utf8 COLLATE utf8_general_ci; _を介して新しいデータベースを作成します

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

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

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

ステップ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');
      }
   }
?>

上記の移行では、id、name、およびemailのフィールドを持つ user テーブルが作成されます。 また、いくつかのデモユーザーを追加します。

  • ステップ5 *-プロジェクトのルート内で./yii migrate *を実行して、データベースに移行を適用します。

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

キャッシュ準備DB

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

データキャッシング

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

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

  • yii \ caching \ DbCache-データベーステーブルを使用して、キャッシュされたデータを保存します。 Uouは、yii \ caching \ DbCache :: $ cacheTableで指定されたテーブルを作成する必要があります。
  • yii \ caching \ ApcCache-PHP APC拡張を使用します。
  • yii \ caching \ FileCache-ファイルを使用してキャッシュされたデータを保存します。
  • yii \ caching \ DummyCache-実際のキャッシングを行わないキャッシュプレースホルダーとして機能します。 このコンポーネントの目的は、キャッシュの可用性を確認する必要があるコードを簡素化することです。
  • yii \ caching \ MemCache-PHP memcache拡張を使用します。
  • yii \ caching \ WinCache-PHP WinCache拡張機能を使用します。
  • yii \ redis \ Cache-Redisデータベースに基づいてキャッシュコンポーネントを実装します。
  • yii \ caching \ XCache-PHP XCache拡張を使用します。

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

  • get()-指定されたキーでキャッシュからデータ値を取得します。 データ値が期限切れ/無効化されているか、見つからない場合は、偽の値が返されます。
  • add()-キーがキャッシュ内に見つからない場合、キーによって識別されるデータ値をキャッシュに保存します。
  • set()-キーで識別されるデータ値をキャッシュに保存します。
  • multiGet()-指定されたキーでキャッシュから複数のデータ値を取得します。
  • multiAdd()-複数のデータ値をキャッシュに保存します。 各アイテムはキーで識別されます。 キーがキャッシュに既に存在する場合、データ値はスキップされます。
  • multiSet()-複数のデータ値をキャッシュに保存します。 各アイテムはキーで識別されます。
  • exists()-指定されたキーがキャッシュで見つかったかどうかを示す値を返します。
  • flush()-すべてのデータ値をキャッシュから削除します。
  • delete()-キーから識別されたデータ値をキャッシュから削除します。

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

キャッシュされたデータ値は、*キャッシュの依存関係*の変更により無効化されることもあります

  • yii \ caching \ DbDependency-指定されたSQLステートメントのクエリ結果が変更されると、依存関係が変更されます。
  • yii \ caching \ ChainedDependency-チェーンの依存関係のいずれかが変更されると、依存関係が変更されます。
  • yii \ caching \ FileDependency-ファイルの最終変更時刻が変更されると、依存関係が変更されます。
  • yii \ caching \ ExpressionDependency-指定されたPHP式の結果が変更されると、依存関係が変更されます。

ここで、 cache アプリケーションコンポーネントをアプリケーションに追加します。

ステップ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;
?>

ステップ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);
}

ステップ3 *-Webブラウザーのアドレスバーに *http://localhost:8080/index.php?r = site/test-cache と入力すると、次のように表示されます。

テストキャッシュ

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

キャッシュされた日付値

クエリキャッシング

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

ステップ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());
}

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

ステップ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 -すべてのキャッシュコンポーネントをフラッシュします。

ステップ3 *-アプリケーションのプロジェクトルート内で。/yii cache/flush-all *を実行します。

プロジェクトルートアプリケーションの実行