Caching in the PHP CDA SDK

Content types and space data change rarely, but you want to access them very often. They are a perfect candidate for caching: you save API calls and speed up execution. Let's take a look at how to locally cache their data using the PHP CDA SDK.

Warming up the cache

The first thing we need to do is to warm up the cache. This process will save our cached JSON files locally in a directory of our choosing. From the command line:

# The command takes three parameters:
# - space-id
# - token
# - cache-dir
php vendor/bin/contentful delivery:cache:warmup cfexampleapi b4c0n73n7fu1 /my/local/cache/path

This command will generate a directory named after the space ID (in our case cfexampleapi), and inside this directory you will find a file called space.json and one file for every content type you have in the space (named ct-<contentType>.json).

Configuring the client

Now that we've created the cache files, let's instruct the Client to use them. To do so, we need to specify the cacheDir option when instantiating a new Contentful\Delivery\Client:

<?php

$client = new \Contentful\Delivery\Client('b4c0n73n7fu1', 'cfexampleapi', false, null, [
    'cacheDir' => '/my/local/cache/path',
]);

The fifth parameter to the constructor is an array of options: you can take a look at the source code for a detailed description of what you can do with it.

Enjoy the performance boost

That's it! Now lookups to cached ContentType and Space objects will be instantaneous. Everything happens behind the scenes, and is transparent to the developer. Should you want to refresh the cache, you can re-run te delivery:cache:warmup command, or you can clear the cache by running:

# The command takes two parameters:
# - space-id
# - cache-dir
php vendor/bin/contentful delivery:cache:clear cfexampleapi /my/local/cache/path

As a final note, remember one thing: should you make changes such as adding or removing a locale, or changing fields in a content type, you would need to regenerate the cache, as the SDK behavior is to use the cache whenever that's available, even at the cost of ignoring newer info. In the event of a new content type, its info would be picked up correctly — there would be nothing about it in the cache. Our suggestion is to warmup the cache at every change to the content types, so you can be sure to always have the best performance and never risk working with obsolete data.