2011-01-11 18:06:12 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Zend Framework
|
|
|
|
*
|
|
|
|
* LICENSE
|
|
|
|
*
|
|
|
|
* This source file is subject to the new BSD license that is bundled
|
|
|
|
* with this package in the file LICENSE.txt.
|
|
|
|
* It is also available through the world-wide-web at this URL:
|
|
|
|
* http://framework.zend.com/license/new-bsd
|
|
|
|
* If you did not receive a copy of the license and are unable to
|
|
|
|
* obtain it through the world-wide-web, please send an email
|
|
|
|
* to license@zend.com so we can send you a copy immediately.
|
|
|
|
*
|
|
|
|
* @category Zend
|
|
|
|
* @package Zend_Cache
|
|
|
|
* @subpackage Zend_Cache_Backend
|
2019-04-04 22:07:05 +00:00
|
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
2011-01-11 18:06:12 +00:00
|
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
2019-04-04 22:07:05 +00:00
|
|
|
* @version $Id$
|
2011-01-11 18:06:12 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @package Zend_Cache
|
|
|
|
* @subpackage Zend_Cache_Backend
|
2019-04-04 22:07:05 +00:00
|
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
2011-01-11 18:06:12 +00:00
|
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
|
|
*/
|
|
|
|
class Zend_Cache_Backend
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Frontend or Core directives
|
|
|
|
*
|
|
|
|
* =====> (int) lifetime :
|
|
|
|
* - Cache lifetime (in seconds)
|
|
|
|
* - If null, the cache is valid forever
|
|
|
|
*
|
|
|
|
* =====> (int) logging :
|
|
|
|
* - if set to true, a logging is activated throw Zend_Log
|
|
|
|
*
|
|
|
|
* @var array directives
|
|
|
|
*/
|
|
|
|
protected $_directives = array(
|
|
|
|
'lifetime' => 3600,
|
|
|
|
'logging' => false,
|
|
|
|
'logger' => null
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Available options
|
|
|
|
*
|
|
|
|
* @var array available options
|
|
|
|
*/
|
|
|
|
protected $_options = array();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @param array $options Associative array of options
|
|
|
|
*/
|
|
|
|
public function __construct(array $options = array())
|
|
|
|
{
|
2019-04-04 22:07:05 +00:00
|
|
|
foreach ($options as $name => $value) {
|
2011-01-11 18:06:12 +00:00
|
|
|
$this->setOption($name, $value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the frontend directives
|
|
|
|
*
|
|
|
|
* @param array $directives Assoc of directives
|
|
|
|
* @throws Zend_Cache_Exception
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function setDirectives($directives)
|
|
|
|
{
|
|
|
|
if (!is_array($directives)) Zend_Cache::throwException('Directives parameter must be an array');
|
|
|
|
while (list($name, $value) = each($directives)) {
|
|
|
|
if (!is_string($name)) {
|
|
|
|
Zend_Cache::throwException("Incorrect option name : $name");
|
|
|
|
}
|
|
|
|
$name = strtolower($name);
|
|
|
|
if (array_key_exists($name, $this->_directives)) {
|
|
|
|
$this->_directives[$name] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->_loggerSanity();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set an option
|
|
|
|
*
|
|
|
|
* @param string $name
|
|
|
|
* @param mixed $value
|
|
|
|
* @throws Zend_Cache_Exception
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function setOption($name, $value)
|
|
|
|
{
|
|
|
|
if (!is_string($name)) {
|
|
|
|
Zend_Cache::throwException("Incorrect option name : $name");
|
|
|
|
}
|
|
|
|
$name = strtolower($name);
|
|
|
|
if (array_key_exists($name, $this->_options)) {
|
|
|
|
$this->_options[$name] = $value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-15 20:49:16 +00:00
|
|
|
/**
|
|
|
|
* Returns an option
|
|
|
|
*
|
|
|
|
* @param string $name Optional, the options name to return
|
|
|
|
* @throws Zend_Cache_Exceptions
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
public function getOption($name)
|
|
|
|
{
|
|
|
|
$name = strtolower($name);
|
|
|
|
|
|
|
|
if (array_key_exists($name, $this->_options)) {
|
|
|
|
return $this->_options[$name];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (array_key_exists($name, $this->_directives)) {
|
|
|
|
return $this->_directives[$name];
|
|
|
|
}
|
|
|
|
|
|
|
|
Zend_Cache::throwException("Incorrect option name : {$name}");
|
|
|
|
}
|
|
|
|
|
2011-01-11 18:06:12 +00:00
|
|
|
/**
|
|
|
|
* Get the life time
|
|
|
|
*
|
|
|
|
* if $specificLifetime is not false, the given specific life time is used
|
|
|
|
* else, the global lifetime is used
|
|
|
|
*
|
|
|
|
* @param int $specificLifetime
|
|
|
|
* @return int Cache life time
|
|
|
|
*/
|
|
|
|
public function getLifetime($specificLifetime)
|
|
|
|
{
|
|
|
|
if ($specificLifetime === false) {
|
|
|
|
return $this->_directives['lifetime'];
|
|
|
|
}
|
|
|
|
return $specificLifetime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return true if the automatic cleaning is available for the backend
|
|
|
|
*
|
|
|
|
* DEPRECATED : use getCapabilities() instead
|
|
|
|
*
|
|
|
|
* @deprecated
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
public function isAutomaticCleaningAvailable()
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine system TMP directory and detect if we have read access
|
|
|
|
*
|
|
|
|
* inspired from Zend_File_Transfer_Adapter_Abstract
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
* @throws Zend_Cache_Exception if unable to determine directory
|
|
|
|
*/
|
|
|
|
public function getTmpDir()
|
|
|
|
{
|
|
|
|
$tmpdir = array();
|
|
|
|
foreach (array($_ENV, $_SERVER) as $tab) {
|
|
|
|
foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) {
|
2014-05-15 20:49:16 +00:00
|
|
|
if (isset($tab[$key]) && is_string($tab[$key])) {
|
2011-01-11 18:06:12 +00:00
|
|
|
if (($key == 'windir') or ($key == 'SystemRoot')) {
|
|
|
|
$dir = realpath($tab[$key] . '\\temp');
|
|
|
|
} else {
|
|
|
|
$dir = realpath($tab[$key]);
|
|
|
|
}
|
|
|
|
if ($this->_isGoodTmpDir($dir)) {
|
|
|
|
return $dir;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$upload = ini_get('upload_tmp_dir');
|
|
|
|
if ($upload) {
|
|
|
|
$dir = realpath($upload);
|
|
|
|
if ($this->_isGoodTmpDir($dir)) {
|
|
|
|
return $dir;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (function_exists('sys_get_temp_dir')) {
|
|
|
|
$dir = sys_get_temp_dir();
|
|
|
|
if ($this->_isGoodTmpDir($dir)) {
|
|
|
|
return $dir;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Attemp to detect by creating a temporary file
|
|
|
|
$tempFile = tempnam(md5(uniqid(rand(), TRUE)), '');
|
|
|
|
if ($tempFile) {
|
|
|
|
$dir = realpath(dirname($tempFile));
|
|
|
|
unlink($tempFile);
|
|
|
|
if ($this->_isGoodTmpDir($dir)) {
|
|
|
|
return $dir;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($this->_isGoodTmpDir('/tmp')) {
|
|
|
|
return '/tmp';
|
|
|
|
}
|
|
|
|
if ($this->_isGoodTmpDir('\\temp')) {
|
|
|
|
return '\\temp';
|
|
|
|
}
|
|
|
|
Zend_Cache::throwException('Could not determine temp directory, please specify a cache_dir manually');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Verify if the given temporary directory is readable and writable
|
|
|
|
*
|
2014-05-15 20:49:16 +00:00
|
|
|
* @param string $dir temporary directory
|
2011-01-11 18:06:12 +00:00
|
|
|
* @return boolean true if the directory is ok
|
|
|
|
*/
|
|
|
|
protected function _isGoodTmpDir($dir)
|
|
|
|
{
|
|
|
|
if (is_readable($dir)) {
|
|
|
|
if (is_writable($dir)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Make sure if we enable logging that the Zend_Log class
|
|
|
|
* is available.
|
|
|
|
* Create a default log object if none is set.
|
|
|
|
*
|
|
|
|
* @throws Zend_Cache_Exception
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function _loggerSanity()
|
|
|
|
{
|
|
|
|
if (!isset($this->_directives['logging']) || !$this->_directives['logging']) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($this->_directives['logger'])) {
|
|
|
|
if ($this->_directives['logger'] instanceof Zend_Log) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Zend_Cache::throwException('Logger object is not an instance of Zend_Log class.');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a default logger to the standard output stream
|
|
|
|
require_once 'Zend/Log.php';
|
|
|
|
require_once 'Zend/Log/Writer/Stream.php';
|
2014-05-15 20:49:16 +00:00
|
|
|
require_once 'Zend/Log/Filter/Priority.php';
|
2011-01-11 18:06:12 +00:00
|
|
|
$logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output'));
|
2014-05-15 20:49:16 +00:00
|
|
|
$logger->addFilter(new Zend_Log_Filter_Priority(Zend_Log::WARN, '<='));
|
2011-01-11 18:06:12 +00:00
|
|
|
$this->_directives['logger'] = $logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Log a message at the WARN (4) priority.
|
|
|
|
*
|
|
|
|
* @param string $message
|
2019-04-04 22:07:05 +00:00
|
|
|
* @param int $priority
|
2011-01-11 18:06:12 +00:00
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
protected function _log($message, $priority = 4)
|
|
|
|
{
|
|
|
|
if (!$this->_directives['logging']) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isset($this->_directives['logger'])) {
|
|
|
|
Zend_Cache::throwException('Logging is enabled but logger is not set.');
|
|
|
|
}
|
|
|
|
$logger = $this->_directives['logger'];
|
|
|
|
if (!$logger instanceof Zend_Log) {
|
|
|
|
Zend_Cache::throwException('Logger object is not an instance of Zend_Log class.');
|
|
|
|
}
|
|
|
|
$logger->log($message, $priority);
|
|
|
|
}
|
2019-04-04 22:07:05 +00:00
|
|
|
}
|