2015-08-17 17:00:26 -07:00
< ? php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license . For more information , see
* < http :// www . doctrine - project . org >.
*/
namespace Doctrine\Common\Cache ;
/**
* Php file cache driver .
*
* @ since 2.3
* @ author Fabio B . Silva < fabio . bat . silva @ gmail . com >
*/
class PhpFileCache extends FileCache
{
const EXTENSION = '.doctrinecache.php' ;
2015-10-08 11:40:12 -07:00
/**
2015-08-17 17:00:26 -07:00
* { @ inheritdoc }
*/
2015-10-08 11:40:12 -07:00
public function __construct ( $directory , $extension = self :: EXTENSION , $umask = 0002 )
{
parent :: __construct ( $directory , $extension , $umask );
}
2015-08-17 17:00:26 -07:00
/**
* { @ inheritdoc }
*/
protected function doFetch ( $id )
{
2015-10-08 11:40:12 -07:00
$value = $this -> includeFileForId ( $id );
2015-08-17 17:00:26 -07:00
2015-10-08 11:40:12 -07:00
if ( ! $value ) {
2015-08-17 17:00:26 -07:00
return false ;
}
if ( $value [ 'lifetime' ] !== 0 && $value [ 'lifetime' ] < time ()) {
return false ;
}
return $value [ 'data' ];
}
/**
* { @ inheritdoc }
*/
protected function doContains ( $id )
{
2015-10-08 11:40:12 -07:00
$value = $this -> includeFileForId ( $id );
2015-08-17 17:00:26 -07:00
2015-10-08 11:40:12 -07:00
if ( ! $value ) {
2015-08-17 17:00:26 -07:00
return false ;
}
return $value [ 'lifetime' ] === 0 || $value [ 'lifetime' ] > time ();
}
/**
* { @ inheritdoc }
*/
protected function doSave ( $id , $data , $lifeTime = 0 )
{
if ( $lifeTime > 0 ) {
$lifeTime = time () + $lifeTime ;
}
if ( is_object ( $data ) && ! method_exists ( $data , '__set_state' )) {
throw new \InvalidArgumentException (
" Invalid argument given, PhpFileCache only allows objects that implement __set_state() " .
" and fully support var_export(). You can use the FilesystemCache to save arbitrary object " .
" graphs using serialize()/deserialize(). "
);
}
2015-10-08 11:40:12 -07:00
$filename = $this -> getFilename ( $id );
2015-08-17 17:00:26 -07:00
$value = array (
'lifetime' => $lifeTime ,
'data' => $data
);
$value = var_export ( $value , true );
$code = sprintf ( '<?php return %s;' , $value );
2015-10-08 11:40:12 -07:00
return $this -> writeFile ( $filename , $code );
}
/**
* @ param string $id
*
* @ return array | false
*/
private function includeFileForId ( $id )
{
$fileName = $this -> getFilename ( $id );
// note: error suppression is still faster than `file_exists`, `is_file` and `is_readable`
$value = @ include $fileName ;
if ( ! isset ( $value [ 'lifetime' ])) {
return false ;
}
return $value ;
2015-08-17 17:00:26 -07:00
}
}