質問: 各ページにアクセスがあった回数をカウントし、該当のページのデータを更新したいのですが、 例えばページにアクセスがあるたびに **1DBに保存しているアクセス数をfindし、** **2そこに+1** **3save** すると、例えば10分で100回アクセスがあると100回DBを更新することになります。 ※100回とも別の人やマシンからのアクセスと考えます。 もっと数が増えると負荷がすごいのでは?毎回DBを書き換える以外に方法は無いのか? と思い、質問させて頂きました。 カウンターなどのプラグインやライブラリを使用するのではなく、 アクセス数(例えばindexアクションが呼び出された回数)をDBに保存したいです。 なにか方法は無いでしょうか? ご教授頂けますと幸いです。よろしくお願い致します。
回答: データベースのアクセスを大幅に増やさずにカウントしたいということですね。 すぐに思いつく方法としては、セッションの保存などに使われることが多いデータストアに一時保管しておいてから、ある程度まとめてデータベースに書き込むとかが、考えられますね。 まずは、PHP から memcached か Redis を利用できるようにする。 memcached http://php.net/manual/ja/book.memcache.php https://memcached.org/ Redis http://redis.io/ https://github.com/phpredis/phpredis/ つぎに CakePHP の Config/core.php に 次のような Cache 設定を行う。 http://book.cakephp.org/3.0/en/core-libraries/caching.html ``` // Redis の場合 Cache::config('default', [ 'engine' => 'Redis', 'server' => '127.0.0.1', 'port' => 6379, ]); // Memcached の場合 Cache::config('default', [ 'engine' => 'Memcache', 'servers' => '127.0.0.1', 'port' => 11211, ]); ``` どちらを使っても 次のような感じで、アクセスできます。 ``` // 読み込み Cache::read(‘key_name’) // 書き出し $data = [ 'key1' => 'data1' ]; Cache::write(‘key_name’, $data) ``` また、CakePHPのキャッシュエンジンにはカウンタAPIがありますので、下記のような使い方もできます。 ``` // 初期データ書き込み Cache::write('view_count', 0); // 加算 Cache::increment('view_count'); // 減算 Cache::decrement('view_count'); ```