memcache_storage.page_cache.inc in Memcache Storage 7
Provides class for memcached data handling within cache_page bin.
File
memcache_storage.page_cache.incView source
<?php
/**
* @file
* Provides class for memcached data handling within cache_page bin.
*/
// Define contant that indicates whether external page cache is enabled.
define('MEMCACHE_STORAGE_EXTERNAL_PAGE_CACHE', variable_get('memcache_storage_external_page_cache', FALSE));
// Load include with Memcache API.
// We don't rely here on Drupal autoload mechanism because this include could
// be used before Drupal registry with all classes is loaded.
require_once dirname(__FILE__) . '/memcache_storage.api.inc';
/**
* Class handles memcached cache objects.
*/
class MemcacheStoragePageCache extends MemcacheStorage implements DrupalCacheInterface {
/**
* Ovirrides MemcacheStorage::getMultiple().
*/
function getMultiple(&$cids) {
// No direct access to the cache if enabled external integration.
if (MEMCACHE_STORAGE_EXTERNAL_PAGE_CACHE) {
return array();
}
// Process page cache get as usual.
return parent::getMultiple($cids);
}
/**
* Ovirrides MemcacheStorage::set().
*/
function set($cid, $data, $expire = CACHE_PERMANENT) {
// Some servers (like Nginx) may access page cache directly from memcached pool
// to avoid passing request to the backend. But they only know how to get
// simple HTML string, not an objects. So we have to store simple HTML code.
if (MEMCACHE_STORAGE_EXTERNAL_PAGE_CACHE && !empty($data['body'])) {
// Make sure that page doesn't have 403 or 404 header.
// Otherwise nginx or varnish will deliver such pages with header
// 200, which is obviously wrong.
if (!empty($data['headers']['Status'])) {
$status = $data['headers']['Status'];
if (in_array($status, array(
'403 Forbidden',
'404 Not Found',
))) {
return FALSE;
}
}
// Developers may set custom expiration for cached pages in settings.php.
$custom_expiration = variable_get('memcache_storage_page_cache_custom_expiration', FALSE);
if ($custom_expiration) {
$expire = variable_get('memcache_storage_page_cache_expire', 0);
}
// Memcached supports TTL in second from current timestamp.
$expire = $expire > REQUEST_TIME ? $expire - REQUEST_TIME : $expire;
// Memcached doesn't support expiration values less than 0 (CACHE_PERMANENT).
$expire = $expire < CACHE_PERMANENT ? CACHE_PERMANENT : $expire;
return MemcacheStorageAPI::set($cid, $data['body'], $expire, $this->bin);
}
// Process cache set as usual.
return parent::set($cid, $data, $expire);
}
/**
* Implements DrupalCacheInterface::clear().
*/
function clear($cid = NULL, $wildcard = FALSE) {
// If enabled memcache storage external page cache we only may delete cache by key.
// This is because memcached doesn't support deletion by wildcard.
if (MEMCACHE_STORAGE_EXTERNAL_PAGE_CACHE && !empty($cid) && !$wildcard) {
// Convert string to an array to reduce amount of 'if-else' sections.
if (!is_array($cid)) {
$cid = array(
$cid,
);
}
// Remove HTML page from the cache_page bin.
foreach ($cid as $cache_id) {
MemcacheStorageAPI::delete($cache_id, $this->bin);
}
}
// Process cache deletion as usual.
return parent::clear($cid, $wildcard);
}
}
Constants
Name | Description |
---|---|
MEMCACHE_STORAGE_EXTERNAL_PAGE_CACHE |
Classes
Name | Description |
---|---|
MemcacheStoragePageCache | Class handles memcached cache objects. |