diff --git a/core/core.services.yml b/core/core.services.yml
index 43c6104..be00ba8 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -25,6 +25,8 @@ services:
   cache.backend.database:
     class: Drupal\Core\Cache\DatabaseBackendFactory
     arguments: ['@database']
+  cache.backend.php:
+    class: Drupal\Core\Cache\PhpBackendFactory
   cache.bootstrap:
     class: Drupal\Core\Cache\CacheBackendInterface
     tags:
diff --git a/core/lib/Drupal/Component/PhpStorage/FileReadOnlyStorage.php b/core/lib/Drupal/Component/PhpStorage/FileReadOnlyStorage.php
index bfb7a2a..90544b0 100644
--- a/core/lib/Drupal/Component/PhpStorage/FileReadOnlyStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/FileReadOnlyStorage.php
@@ -83,4 +83,12 @@ function writeable() {
   public function deleteAll() {
     return FALSE;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPath($name) {
+    return $this->getFullPath($name);
+  }
+
 }
diff --git a/core/lib/Drupal/Component/PhpStorage/FileStorage.php b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
index 67399ab..c42f237 100644
--- a/core/lib/Drupal/Component/PhpStorage/FileStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
@@ -191,6 +191,13 @@ protected function getFullPath($name) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getPath($name) {
+    return $this->getFullPath($name);
+  }
+
+  /**
    * Implements Drupal\Component\PhpStorage\PhpStorageInterface::writeable().
    */
   public function writeable() {
diff --git a/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFileStorage.php b/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFileStorage.php
index b9dd5b0..573e23c 100644
--- a/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFileStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFileStorage.php
@@ -65,4 +65,12 @@ protected function checkFile($name) {
     $filename = $this->getFullPath($name, $directory, $directory_mtime);
     return file_exists($filename) && filemtime($filename) <= $directory_mtime ? $filename : FALSE;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPath($name) {
+    return $this->checkFile($name);
+  }
+
 }
diff --git a/core/lib/Drupal/Component/PhpStorage/PhpStorageInterface.php b/core/lib/Drupal/Component/PhpStorage/PhpStorageInterface.php
index 03ca812..5889222 100644
--- a/core/lib/Drupal/Component/PhpStorage/PhpStorageInterface.php
+++ b/core/lib/Drupal/Component/PhpStorage/PhpStorageInterface.php
@@ -78,4 +78,17 @@ public function delete($name);
    * Removes all files in this bin.
    */
   public function deleteAll();
+
+  /**
+   * Gets the full file path.
+   *
+   * @param string $name
+   *   The virtual file name. Can be a relative path.
+   *
+   * @return string|FALSE
+   *   The full file path for the provided name. Return FALSE if the
+   *   implementation needs to prevent access to the file.
+   */
+  public function getPath($name);
+
 }
diff --git a/core/lib/Drupal/Core/Cache/CacheFactory.php b/core/lib/Drupal/Core/Cache/CacheFactory.php
index b756e91..6b9544d 100644
--- a/core/lib/Drupal/Core/Cache/CacheFactory.php
+++ b/core/lib/Drupal/Core/Cache/CacheFactory.php
@@ -57,7 +57,13 @@ public function get($bin) {
       $service_name = $cache_settings['default'];
     }
     else {
-      $service_name = 'cache.backend.database';
+      // @todo do something more sensible.
+      if ($bin == 'config') {
+        $service_name = 'cache.backend.php';
+      }
+      else {
+        $service_name = 'cache.backend.database';
+      }
     }
     return $this->container->get($service_name)->get($bin);
   }
diff --git a/core/lib/Drupal/Core/Cache/PhpBackend.php b/core/lib/Drupal/Core/Cache/PhpBackend.php
new file mode 100644
index 0000000..74b85da
--- /dev/null
+++ b/core/lib/Drupal/Core/Cache/PhpBackend.php
@@ -0,0 +1,301 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Cache\PhpBackend.
+ */
+
+namespace Drupal\Core\Cache;
+
+use Drupal\Component\PhpStorage\PhpStorageFactory;
+use Drupal\Component\Utility\Variable;
+
+/**
+ * Defines a PHP cache implementation.
+ *
+ * Stores cache items in a PHP file using a storage that implements
+ * Drupal\Component\PhpStorage\PhpStorageInterface.
+ *
+ * @ingroup cache
+ */
+class PhpBackend implements CacheBackendInterface {
+
+  /**
+   * @var string
+   */
+  protected $bin;
+
+  /**
+   * Array to store cache objects.
+   */
+  protected $cache = array();
+
+  /**
+   * Constructs a MemoryBackend object.
+   *
+   * @param string $bin
+   *   The cache bin for which the object is created.
+   */
+  public function __construct($bin) {
+    $this->bin = $bin;
+    $this->loadCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function get($cid, $allow_invalid = FALSE) {
+    $cids = array($cid);
+    $cache = $this->getMultiple($cids, $allow_invalid);
+    return reset($cache);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMultiple(&$cids, $allow_invalid = FALSE) {
+    $ret = array();
+
+    $items = array_intersect_key($this->cache, array_flip($cids));
+
+    foreach ($items as $item) {
+      $item = $this->prepareItem($item, $allow_invalid);
+      if ($item) {
+        $ret[$item->cid] = $item;
+      }
+    }
+
+    $cids = array_diff($cids, array_keys($ret));
+
+    return $ret;
+  }
+
+  /**
+   * Prepares a cached item.
+   *
+   * Checks that items are either permanent or did not expire, and returns data
+   * as appropriate.
+   *
+   * @param object $cache
+   *   An item loaded from cache_get() or cache_get_multiple().
+   *
+   * @return mixed
+   *   The item with data as appropriate or FALSE if there is no
+   *   valid item to load.
+   */
+  protected function prepareItem($cache, $allow_invalid) {
+    if (!isset($cache->data)) {
+      return FALSE;
+    }
+
+    // Check expire time.
+    $cache->valid = $cache->expire == Cache::PERMANENT || $cache->expire >= REQUEST_TIME;
+
+    if (!$allow_invalid && !$cache->valid) {
+      return FALSE;
+    }
+
+    return $cache;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array()) {
+    $this->cache[$cid] = (object) array(
+      'cid' => $cid,
+      'data' => $data,
+      'created' => REQUEST_TIME,
+      'expire' => $expire,
+      'tags' => $this->flattenTags($tags),
+    );
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function delete($cid) {
+    unset($this->cache[$cid]);
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteMultiple(array $cids) {
+    $this->cache = array_diff_key($this->cache, array_flip($cids));
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteTags(array $tags) {
+    $this->cache = array();
+    $this->writeCache();
+    return;
+
+    $flat_tags = $this->flattenTags($tags);
+    foreach ($this->cache as $cid => $item) {
+      if (array_intersect($flat_tags, $item->tags)) {
+        unset($this->cache[$cid]);
+      }
+    }
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteAll() {
+    $this->cache = array();
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function invalidate($cid) {
+    if (isset($this->cache[$cid])) {
+      $this->cache[$cid]->expire = REQUEST_TIME - 1;
+    }
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function invalidateMultiple(array $cids) {
+    foreach ($cids as $cid) {
+      $this->cache[$cid]->expire = REQUEST_TIME - 1;
+    }
+    $this->writeCache();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function invalidateTags(array $tags) {
+    $this->cache = array();
+    $this->writeCache();
+    return;
+
+    $change = FALSE;
+    $flat_tags = $this->flattenTags($tags);
+    foreach ($this->cache as $cid => $item) {
+      if (array_intersect($flat_tags, $item->tags)) {
+        $this->cache[$cid]->expire = REQUEST_TIME - 1;
+        $change = TRUE;
+      }
+    }
+    if ($change) {
+      $this->writeCache();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function invalidateAll() {
+    foreach ($this->cache as $cid => $item) {
+      $this->cache[$cid]->expire = REQUEST_TIME - 1;
+    }
+    $this->writeCache();
+  }
+
+  /**
+   * 'Flattens' a tags array into an array of strings.
+   *
+   * @param array $tags
+   *   Associative array of tags to flatten.
+   *
+   * @return array
+   *   An indexed array of strings.
+   */
+  protected function flattenTags(array $tags) {
+    if (isset($tags[0])) {
+      return $tags;
+    }
+
+    $flat_tags = array();
+    foreach ($tags as $namespace => $values) {
+      if (is_array($values)) {
+        foreach ($values as $value) {
+          $flat_tags["$namespace:$value"] = "$namespace:$value";
+        }
+      }
+      else {
+        $flat_tags["$namespace:$values"] = "$namespace:$values";
+      }
+    }
+    return $flat_tags;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    return empty($this->cache);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function garbageCollection() {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function removeBin() {
+    $this->cache = array();
+    $this->storage()->delete($this->bin);
+  }
+
+  /**
+   * Writes the cache to PHP storage.
+   */
+  protected function writeCache() {
+    $storage = $this->storage();
+    $data = Variable::export($this->cache);
+    $content =<<<EOF
+<?php
+\$cache = $data;
+EOF;
+    $storage->save($this->bin, $content);
+  }
+
+  /**
+   * Loads the cache from PHP storage.
+   */
+  protected function loadCache() {
+    $storage = $this->storage();
+
+    // Whether or not Drupal\Component\PhpStorage\PhpStorageInterface::getPath()
+    // checks for the existence of the file is an implementation of the storage.
+    if ($filename = $storage->getPath($this->bin)) {
+      // If this file exists it'll set a variable called $cache.
+      @include_once $filename;
+    }
+    if (isset($cache)) {
+      $this->cache = $cache;
+    }
+    else {
+      $this->cache = array();
+    }
+  }
+
+  /**
+   * Gets the PHP code storage object to use.
+   *
+   * @return \Drupal\Component\PhpStorage\PhpStorageInterface
+   */
+  protected function storage() {
+    if (!isset($this->storage)) {
+      $this->storage = PhpStorageFactory::get('cache');
+    }
+    return $this->storage;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Cache/PhpBackendFactory.php b/core/lib/Drupal/Core/Cache/PhpBackendFactory.php
new file mode 100644
index 0000000..0801b72
--- /dev/null
+++ b/core/lib/Drupal/Core/Cache/PhpBackendFactory.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Cache\PhpBackendFactory.
+ */
+
+namespace Drupal\Core\Cache;
+
+class PhpBackendFactory implements CacheFactoryInterface {
+
+  /**
+   * Gets PhpBackend for the specified cache bin.
+   *
+   * @param $bin
+   *   The cache bin for which the object is created.
+   *
+   * @return \Drupal\Core\Cache\PhpBackend
+   *   The cache backend object for the specified cache bin.
+   */
+  function get($bin) {
+    return new PhpBackend($bin);
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/PhpBackendUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Cache/PhpBackendUnitTest.php
new file mode 100644
index 0000000..6258550
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/PhpBackendUnitTest.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\PhpBackendUnitTest.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+use Drupal\Core\Cache\PhpBackend;
+
+/**
+ * Tests PhpBackendUnitTest using GenericCacheBackendUnitTestBase.
+ */
+class PhpBackendUnitTest extends GenericCacheBackendUnitTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Php cache backend',
+      'description' => 'Unit test of the PHP cache backend using the generic cache unit test base.',
+      'group' => 'Cache',
+    );
+  }
+
+  /**
+   * Creates a new instance of MemoryBackend.
+   *
+   * @return
+   *   A new MemoryBackend object.
+   */
+  protected function createCacheBackend($bin) {
+    return new PhpBackend($bin);
+  }
+
+}
