function DatabaseBackend::getMultiple

Same name in other branches
  1. 9 core/lib/Drupal/Core/Cache/DatabaseBackend.php \Drupal\Core\Cache\DatabaseBackend::getMultiple()
  2. 8.9.x core/lib/Drupal/Core/Cache/DatabaseBackend.php \Drupal\Core\Cache\DatabaseBackend::getMultiple()
  3. 10 core/lib/Drupal/Core/Cache/DatabaseBackend.php \Drupal\Core\Cache\DatabaseBackend::getMultiple()

Overrides CacheBackendInterface::getMultiple

1 call to DatabaseBackend::getMultiple()
DatabaseBackend::get in core/lib/Drupal/Core/Cache/DatabaseBackend.php
Returns data from the persistent cache.

File

core/lib/Drupal/Core/Cache/DatabaseBackend.php, line 117

Class

DatabaseBackend
Defines a default cache implementation.

Namespace

Drupal\Core\Cache

Code

public function getMultiple(&$cids, $allow_invalid = FALSE) {
    $cid_mapping = [];
    foreach ($cids as $cid) {
        $cid_mapping[$this->normalizeCid($cid)] = $cid;
    }
    // When serving cached pages, the overhead of using ::select() was found
    // to add around 30% overhead to the request. Since $this->bin is a
    // variable, this means the call to ::query() here uses a concatenated
    // string. This is highly discouraged under any other circumstances, and
    // is used here only due to the performance overhead we would incur
    // otherwise. When serving an uncached page, the overhead of using
    // ::select() is a much smaller proportion of the request.
    $result = [];
    try {
        $result = $this->connection
            ->query('SELECT [cid], [data], [created], [expire], [serialized], [tags], [checksum] FROM {' . $this->connection
            ->escapeTable($this->bin) . '} WHERE [cid] IN ( :cids[] ) ORDER BY [cid]', [
            ':cids[]' => array_keys($cid_mapping),
        ])
            ->fetchAll();
    } catch (\Exception) {
        // Nothing to do.
    }
    // Before checking the validity of each item individually, register the
    // cache tags for all returned cache items for preloading, this allows the
    // cache tag service to optimize cache tag lookups.
    if ($this->checksumProvider instanceof CacheTagsChecksumPreloadInterface) {
        $tags_for_preload = [];
        foreach ($result as $item) {
            if ($item->tags) {
                $tags_for_preload[] = explode(' ', $item->tags);
            }
        }
        $this->checksumProvider
            ->registerCacheTagsForPreload(array_merge(...$tags_for_preload));
    }
    $cache = [];
    foreach ($result as $item) {
        // Map the cache ID back to the original.
        $item->cid = $cid_mapping[$item->cid];
        $item = $this->prepareItem($item, $allow_invalid);
        if ($item) {
            $cache[$item->cid] = $item;
        }
    }
    $cids = array_diff($cids, array_keys($cache));
    return $cache;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.