Kohana v3.3.5
This commit is contained in:
3
modules/cache/classes/Cache/Apcu.php
vendored
Normal file
3
modules/cache/classes/Cache/Apcu.php
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php defined('SYSPATH') or die('No direct script access.');
|
||||
|
||||
class Cache_Apcu extends Kohana_Cache_Apcu {}
|
10
modules/cache/classes/Kohana/Cache.php
vendored
10
modules/cache/classes/Kohana/Cache.php
vendored
@@ -36,7 +36,7 @@
|
||||
* Below is an example of a _memcache_ server configuration.
|
||||
*
|
||||
* return array(
|
||||
* 'default' => array( // Default group
|
||||
* 'memcache' => array( // Name of group
|
||||
* 'driver' => 'memcache', // using Memcache driver
|
||||
* 'servers' => array( // Available server definitions
|
||||
* array(
|
||||
@@ -49,8 +49,12 @@
|
||||
* ),
|
||||
* )
|
||||
*
|
||||
* In cases where only one cache group is required, if the group is named `default` there is
|
||||
* no need to pass the group name when instantiating a cache instance.
|
||||
* In cases where only one cache group is required, set `Cache::$default` (in your bootstrap,
|
||||
* or by extending `Kohana_Cache` class) to the name of the group, and use:
|
||||
*
|
||||
* $cache = Cache::instance(); // instead of Cache::instance('memcache')
|
||||
*
|
||||
* It will return the cache instance of the group it has been set in `Cache::$default`.
|
||||
*
|
||||
* #### General cache group configuration settings
|
||||
*
|
||||
|
174
modules/cache/classes/Kohana/Cache/Apcu.php
vendored
Normal file
174
modules/cache/classes/Kohana/Cache/Apcu.php
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
<?php defined('SYSPATH') or die('No direct script access.');
|
||||
/**
|
||||
* [Kohana Cache](api/Kohana_Cache) APCu data store driver for Kohana Cache
|
||||
* library.
|
||||
*
|
||||
* ### Configuration example
|
||||
*
|
||||
* Below is an example of an _apcu_ server configuration.
|
||||
*
|
||||
* return array(
|
||||
* 'apcu' => array( // Driver group
|
||||
* 'driver' => 'apcu', // using APCu driver
|
||||
* ),
|
||||
* )
|
||||
*
|
||||
* In cases where only one cache group is required, if the group is named `default` there is
|
||||
* no need to pass the group name when instantiating a cache instance.
|
||||
*
|
||||
* #### General cache group configuration settings
|
||||
*
|
||||
* Below are the settings available to all types of cache driver.
|
||||
*
|
||||
* Name | Required | Description
|
||||
* -------------- | -------- | ---------------------------------------------------------------
|
||||
* driver | __YES__ | (_string_) The driver type to use
|
||||
*
|
||||
* ### System requirements
|
||||
*
|
||||
* * Kohana 3.0.x
|
||||
* * PHP 5.2.4 or greater
|
||||
* * APCu PHP extension
|
||||
*
|
||||
* @package Kohana/Cache
|
||||
* @category Base
|
||||
* @author Kohana Team
|
||||
* @copyright (c) 2009-2012 Kohana Team
|
||||
* @license http://kohanaphp.com/license
|
||||
*/
|
||||
class Kohana_Cache_Apcu extends Cache implements Cache_Arithmetic {
|
||||
|
||||
/**
|
||||
* Check for existence of the APCu extension This method cannot be invoked externally. The driver must
|
||||
* be instantiated using the `Cache::instance()` method.
|
||||
*
|
||||
* @param array $config configuration
|
||||
* @throws Cache_Exception
|
||||
*/
|
||||
protected function __construct(array $config)
|
||||
{
|
||||
if ( ! extension_loaded('apcu'))
|
||||
{
|
||||
throw new Cache_Exception('PHP APCu extension is not available.');
|
||||
}
|
||||
|
||||
parent::__construct($config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a cached value entry by id.
|
||||
*
|
||||
* // Retrieve cache entry from apcu group
|
||||
* $data = Cache::instance('apcu')->get('foo');
|
||||
*
|
||||
* // Retrieve cache entry from apcu group and return 'bar' if miss
|
||||
* $data = Cache::instance('apcu')->get('foo', 'bar');
|
||||
*
|
||||
* @param string $id id of cache to entry
|
||||
* @param string $default default value to return if cache miss
|
||||
* @return mixed
|
||||
* @throws Cache_Exception
|
||||
*/
|
||||
public function get($id, $default = NULL)
|
||||
{
|
||||
$data = apcu_fetch($this->_sanitize_id($id), $success);
|
||||
|
||||
return $success ? $data : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a value to cache with id and lifetime
|
||||
*
|
||||
* $data = 'bar';
|
||||
*
|
||||
* // Set 'bar' to 'foo' in apcu group, using default expiry
|
||||
* Cache::instance('apcu')->set('foo', $data);
|
||||
*
|
||||
* // Set 'bar' to 'foo' in apcu group for 30 seconds
|
||||
* Cache::instance('apcu')->set('foo', $data, 30);
|
||||
*
|
||||
* @param string $id id of cache entry
|
||||
* @param string $data data to set to cache
|
||||
* @param integer $lifetime lifetime in seconds
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($id, $data, $lifetime = NULL)
|
||||
{
|
||||
if ($lifetime === NULL)
|
||||
{
|
||||
$lifetime = Arr::get($this->_config, 'default_expire', Cache::DEFAULT_EXPIRE);
|
||||
}
|
||||
|
||||
return apcu_store($this->_sanitize_id($id), $data, $lifetime);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a cache entry based on id
|
||||
*
|
||||
* // Delete 'foo' entry from the apcu group
|
||||
* Cache::instance('apcu')->delete('foo');
|
||||
*
|
||||
* @param string $id id to remove from cache
|
||||
* @return boolean
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
return apcu_delete($this->_sanitize_id($id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all cache entries.
|
||||
*
|
||||
* Beware of using this method when
|
||||
* using shared memory cache systems, as it will wipe every
|
||||
* entry within the system for all clients.
|
||||
*
|
||||
* // Delete all cache entries in the apcu group
|
||||
* Cache::instance('apcu')->delete_all();
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function delete_all()
|
||||
{
|
||||
return apcu_clear_cache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments a given value by the step value supplied.
|
||||
* Useful for shared counters and other persistent integer based
|
||||
* tracking.
|
||||
*
|
||||
* @param string id of cache entry to increment
|
||||
* @param int step value to increment by
|
||||
* @return integer
|
||||
* @return boolean
|
||||
*/
|
||||
public function increment($id, $step = 1)
|
||||
{
|
||||
if (apcu_exists($id)) {
|
||||
return apcu_inc($id, $step);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrements a given value by the step value supplied.
|
||||
* Useful for shared counters and other persistent integer based
|
||||
* tracking.
|
||||
*
|
||||
* @param string id of cache entry to decrement
|
||||
* @param int step value to decrement by
|
||||
* @return integer
|
||||
* @return boolean
|
||||
*/
|
||||
public function decrement($id, $step = 1)
|
||||
{
|
||||
if (apcu_exists($id)) {
|
||||
return apcu_dec($id, $step);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
} // End Kohana_Cache_Apcu
|
93
modules/cache/classes/Kohana/Cache/File.php
vendored
93
modules/cache/classes/Kohana/Cache/File.php
vendored
@@ -140,17 +140,21 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
}
|
||||
else
|
||||
{
|
||||
// Open the file and parse data
|
||||
$created = $file->getMTime();
|
||||
$data = $file->openFile();
|
||||
$lifetime = $data->fgets();
|
||||
|
||||
// If we're at the EOF at this point, corrupted!
|
||||
if ($data->eof())
|
||||
// Test the expiry
|
||||
if ($this->_is_expired($file))
|
||||
{
|
||||
throw new Cache_Exception(__METHOD__.' corrupted cache file!');
|
||||
// Delete the file
|
||||
$this->_delete_file($file, FALSE, TRUE);
|
||||
return $default;
|
||||
}
|
||||
|
||||
// open the file to read data
|
||||
$data = $file->openFile();
|
||||
|
||||
// Run first fgets(). Cache data starts from the second line
|
||||
// as the first contains the lifetime timestamp
|
||||
$data->fgets();
|
||||
|
||||
$cache = '';
|
||||
|
||||
while ($data->eof() === FALSE)
|
||||
@@ -158,17 +162,7 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
$cache .= $data->fgets();
|
||||
}
|
||||
|
||||
// Test the expiry
|
||||
if (($created + (int) $lifetime) < time())
|
||||
{
|
||||
// Delete the file
|
||||
$this->_delete_file($file, NULL, TRUE);
|
||||
return $default;
|
||||
}
|
||||
else
|
||||
{
|
||||
return unserialize($cache);
|
||||
}
|
||||
return unserialize($cache);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -219,14 +213,7 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
// If the directory path is not a directory
|
||||
if ( ! $dir->isDir())
|
||||
{
|
||||
// Create the directory
|
||||
if ( ! mkdir($directory, 0777, TRUE))
|
||||
{
|
||||
throw new Cache_Exception(__METHOD__.' unable to create directory : :directory', array(':directory' => $directory));
|
||||
}
|
||||
|
||||
// chmod to solve potential umask issues
|
||||
chmod($directory, 0777);
|
||||
$this->_make_directory($directory, 0777, TRUE);
|
||||
}
|
||||
|
||||
// Open file to inspect
|
||||
@@ -267,7 +254,7 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
$filename = Cache_File::filename($this->_sanitize_id($id));
|
||||
$directory = $this->_resolve_directory($filename);
|
||||
|
||||
return $this->_delete_file(new SplFileInfo($directory.$filename), NULL, TRUE);
|
||||
return $this->_delete_file(new SplFileInfo($directory.$filename), FALSE, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -337,9 +324,7 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
else
|
||||
{
|
||||
// Assess the file expiry to flag it for deletion
|
||||
$json = $file->openFile('r')->current();
|
||||
$data = json_decode($json);
|
||||
$delete = $data->expiry < time();
|
||||
$delete = $this->_is_expired($file);
|
||||
}
|
||||
|
||||
// If the delete flag is set delete file
|
||||
@@ -375,7 +360,7 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
// Create new file resource
|
||||
$fp = new SplFileInfo($files->getRealPath());
|
||||
// Delete the file
|
||||
$this->_delete_file($fp);
|
||||
$this->_delete_file($fp, $retain_parent_directory, $ignore_errors, $only_expired);
|
||||
}
|
||||
|
||||
// Move the file pointer on
|
||||
@@ -446,21 +431,55 @@ class Kohana_Cache_File extends Cache implements Cache_GarbageCollect {
|
||||
* `mkdir` to ensure DRY principles
|
||||
*
|
||||
* @link http://php.net/manual/en/function.mkdir.php
|
||||
* @param string $directory
|
||||
* @param integer $mode
|
||||
* @param boolean $recursive
|
||||
* @param resource $context
|
||||
* @param string $directory directory path
|
||||
* @param integer $mode chmod mode
|
||||
* @param boolean $recursive allows nested directories creation
|
||||
* @param resource $context a stream context
|
||||
* @return SplFileInfo
|
||||
* @throws Cache_Exception
|
||||
*/
|
||||
protected function _make_directory($directory, $mode = 0777, $recursive = FALSE, $context = NULL)
|
||||
{
|
||||
if ( ! mkdir($directory, $mode, $recursive, $context))
|
||||
// call mkdir according to the availability of a passed $context param
|
||||
$mkdir_result = $context ?
|
||||
mkdir($directory, $mode, $recursive, $context) :
|
||||
mkdir($directory, $mode, $recursive);
|
||||
|
||||
// throw an exception if unsuccessful
|
||||
if ( ! $mkdir_result)
|
||||
{
|
||||
throw new Cache_Exception('Failed to create the defined cache directory : :directory', array(':directory' => $directory));
|
||||
}
|
||||
|
||||
// chmod to solve potential umask issues
|
||||
chmod($directory, $mode);
|
||||
|
||||
return new SplFileInfo($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if cache file is expired
|
||||
*
|
||||
* @param SplFileInfo $file the cache file
|
||||
* @return boolean TRUE if expired false otherwise
|
||||
*/
|
||||
protected function _is_expired(SplFileInfo $file)
|
||||
{
|
||||
// Open the file and parse data
|
||||
$created = $file->getMTime();
|
||||
$data = $file->openFile("r");
|
||||
$lifetime = (int) $data->fgets();
|
||||
|
||||
// If we're at the EOF at this point, corrupted!
|
||||
if ($data->eof())
|
||||
{
|
||||
throw new Cache_Exception(__METHOD__ . ' corrupted cache file!');
|
||||
}
|
||||
|
||||
//close file
|
||||
$data = null;
|
||||
|
||||
// test for expiry and return
|
||||
return (($lifetime !== 0) AND ( ($created + $lifetime) < time()));
|
||||
}
|
||||
}
|
||||
|
6
modules/cache/classes/Kohana/HTTP/Cache.php
vendored
6
modules/cache/classes/Kohana/HTTP/Cache.php
vendored
@@ -1,6 +1,6 @@
|
||||
<?php defined('SYSPATH') or die('No direct script access.');
|
||||
/**
|
||||
* HTTT Caching adaptor class that provides caching services to the
|
||||
* HTTP Caching adaptor class that provides caching services to the
|
||||
* [Request_Client] class, using HTTP cache control logic as defined in
|
||||
* RFC 2616.
|
||||
*
|
||||
@@ -36,7 +36,7 @@ class Kohana_HTTP_Cache {
|
||||
* )
|
||||
* );
|
||||
*
|
||||
* @uses [Cache]
|
||||
* @uses Cache
|
||||
* @param mixed $cache cache engine to use
|
||||
* @param array $options options to set to this class
|
||||
* @return HTTP_Cache
|
||||
@@ -298,7 +298,7 @@ class Kohana_HTTP_Cache {
|
||||
* Controls whether the response can be cached. Uses HTTP
|
||||
* protocol to determine whether the response can be cached.
|
||||
*
|
||||
* @link RFC 2616 http://www.w3.org/Protocols/rfc2616/
|
||||
* @link http://www.w3.org/Protocols/rfc2616/rfc2616.html RFC 2616
|
||||
* @param Response $response The Response
|
||||
* @return boolean
|
||||
*/
|
||||
|
Reference in New Issue
Block a user