You are here

public function DatabaseBackend::getMultiple in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Cache/DatabaseBackend.php \Drupal\Core\Cache\DatabaseBackend::getMultiple()
  2. 9 core/lib/Drupal/Core/Cache/DatabaseBackend.php \Drupal\Core\Cache\DatabaseBackend::getMultiple()

File

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

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),
    ]);
  } catch (\Exception $e) {

    // Nothing to do.
  }
  $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;
}