Seditio Source
Root |
./othercms/ips_4.3.4/system/Data/Cache/Apc.php
<?php
/**
 * @brief        APC Caching Class
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @since        17 Sept 2013
 */

namespace IPS\Data\Cache;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * APC Storage Class
 */
class _Apc extends \IPS\Data\Cache
{
   
/**
     * Server supports this method?
     *
     * @return    bool
     */
   
public static function supported()
    {
        return
function_exists('apcu_fetch');
    }
   
   
/**
     * Abstract Method: Get
     *
     * @param    string    $key    Key
     * @return    string    Value from the _datastore
     */
   
protected function get( $key )
    {
        if( isset(
$this->cache[ $key ] ) )
        {
            \
IPS\Log::debug( "Get {$key} from APC (already loaded)", 'cache' );
            return
$this->cache[ $key ];
        }

        \
IPS\Log::debug( "Get {$key} from APC", 'cache' );
       
       
$this->cache[ $key ]    = apcu_fetch( \IPS\SUITE_UNIQUE_KEY . '_' . $key );
        return
$this->cache[ $key ];
    }
   
   
/**
     * Abstract Method: Set
     *
     * @param    string            $key    Key
     * @param    string            $value    Value
     * @para,    \IPS\DateTime    $expire    Expreation time, or NULL for no expiration
     * @return    bool
     */
   
protected function set( $key, $value, \IPS\DateTime $expire = NULL )
    {
        \
IPS\Log::debug( "Set {$key} in APC", 'cache' );
        return (bool)
apcu_store( \IPS\SUITE_UNIQUE_KEY . '_' . $key, $value, $expire ? ( $expire->getTimestamp() - time() ) : 0 );
    }
   
   
/**
     * Abstract Method: Exists?
     *
     * @param    string    $key    Key
     * @return    bool
     */
   
protected function exists( $key )
    {
        if( isset(
$this->cache[ $key ] ) )
        {
            \
IPS\Log::debug( "Check exists {$key} from APC (already loaded)", 'cache' );
            return (
$this->cache[ $key ] === FALSE ) ? FALSE : TRUE;
        }

        \
IPS\Log::debug( "Check exists {$key} from APC", 'cache' );

       
$result = apcu_fetch( \IPS\SUITE_UNIQUE_KEY . '_' . $key, $exists );
        if (
$exists )
        {
           
$this->cache[ $key ] = $result;
            return
TRUE;
        }
        else
        {
            return
FALSE;
        }
    }
   
   
/**
     * Abstract Method: Delete
     *
     * @param    string    $key    Key
     * @return    bool
     */
   
protected function delete( $key )
    {
        \
IPS\Log::debug( "Delete {$key} from APC", 'cache' );
        return (bool)
apcu_delete( \IPS\SUITE_UNIQUE_KEY . '_' . $key );
    }
   
   
/**
     * Abstract Method: Clear All Caches
     *
     * @return    void
     */
   
public function clearAll()
    {
       
parent::clearAll();
       
apcu_clear_cache();
    }
}