Пагинация страниц при кэшировании объектов в CakePHP



Если у вас на сайте имеется какой-либо контент, который изменяется не часто, то разумным решением будет организация его кэширования. Это позволит увеличить (порой бывает даже значительно увеличить) скорость работы сайта за счет сокращения количества запросов к базе данных, так как информация, выдаваемая пользователю, извлекается с быстродоступных носителей. CakePHP предоставляет довольно удобную и понятную систему кэширования данных и в этой статье будет рассмотрен вариант кэширования объектов, полученных в результате запросов к базе данных, созданных с помощью CakePHP ORM. А так как этих объектов (например, статей) может быть большое количество, мы произведем их постраничную разбивку.

Для начала давайте настроим действие (экшен) index контроллера ArticlesController для постраничного вывода статей. Так как компонент разбивки на страницы pagination в CakePHP является мощным и простым в настройке, в нашем контроллере не будет большого количества кода:

namespace App\Controller;
use App\Controller\AppController;
use Cake\Cache\Cache;
 
class SitemapController extends AppController
{
    public function index()
    {
        $this->paginate = [
            'limit' => 30, //устанавливаем лимит по количеству статей на одной странице
            'order' => ['created' => 'DESC'], //сортируем по дате создания (поле 'created')
        ];
        //получаем номер страницы из параметров запроса:
        $page = $this->request->getQuery('page');
        //получаем статьи из кэша (если кэша нет, то бутет произведен запрос к базе данных):
        $query = $this->Articles->find()->cache('get_articles_index'.$page, 'my_cache');
        //передаем статьи в пагинатор:
        $articles = $this->paginate($query);
        $this->set(compact('articles'));
    }
}

Для каждой страницы мы определяем свой собственный кэш, доступ к которому осуществляется по ключу, сформированному из произвольного названия (в нашем случае это 'get_articles_index') и переменной $page, в которой содержится номер страницы.

Ну и не забываем произвести настройку конфигурации кэширования, путем добавления в массив 'Cache' файла \config\app.php следующего кода:

 'my_cache' => [
       'className' => 'File',
       'duration' => '+1 week',
       'path' => CACHE.'/mycache',
       'prefix' => 'my_ prefix_'
],

В примере мы настроили конфигурацию кеширования через создание локальных файлов. Вы же, можете использовать более быстрые механизмы кэширования, например, Memcached, Redis и другие. Настройка этих механизмов в CakePHP, так же, чрезвычайно проста.

А на этом у меня всё. Дополнительную информацию по организации кэширования в CakePHP вы можете посмотреть на официальном сайте кейка.

Теги: Кэш, ORM

Поделиться: