- Updated local libraries
- PHP 7.1 support
- New, proper caching method
- Special cache folder
pull/27/head
Wruczek 8 years ago
parent af2d44a713
commit 1ffaee0730

1
.gitignore vendored

@ -1,6 +1,7 @@
config/config.php config/config.php
prototypes/ prototypes/
admin/ admin/
cache/localhost
# PhpStorm # PhpStorm
.idea/ .idea/

@ -4,26 +4,17 @@ header('Content-Type: application/json');
set_error_handler("exception_error_handler", E_ALL); set_error_handler("exception_error_handler", E_ALL);
require_once __DIR__ . "/../include/tsutils.php"; require_once __DIR__ . "/../include/tsutils.php";
require_once __DIR__ . "/../lib/phpfastcache/autoload.php"; require_once __DIR__ . "/../include/cacheutils.class.php";
date_default_timezone_set($config["general"]["timezone"]); date_default_timezone_set($config["general"]["timezone"]);
use phpFastCache\Util; $cacheutils = new CacheUtils('serverstatus');
use phpFastCache\CacheManager;
Util\Languages::setEncoding("UTF-8"); if($cacheutils->isExpired()) {
$cache = CacheManager::Files(); $cacheutils->setValue(getResult(), 10);
$serverstatus = $cache->get('serverstatus');
// $cache->clean();
if (is_null($serverstatus)) {
$serverstatus = getResult();
$cache->set('serverstatus', $serverstatus, 10);
} }
die ($serverstatus); die ($cacheutils->getValue());
// ********* // *********
// METHODS // METHODS

@ -2,23 +2,15 @@
$bansPage = true; $bansPage = true;
require_once __DIR__ . "/include/header.php"; require_once __DIR__ . "/include/header.php";
require_once __DIR__ . "/include/tsutils.php"; require_once __DIR__ . "/include/tsutils.php";
require_once __DIR__ . "/lib/phpfastcache/autoload.php"; require_once __DIR__ . "/include/cacheutils.class.php";
$cacheutils = new CacheUtils('banlist');
use phpFastCache\Util; if($cacheutils->isExpired()) {
use phpFastCache\CacheManager; $cacheutils->setValue([getBanlist(), date('d-m-Y H:i:s')], 300);
Util\Languages::setEncoding("UTF-8");
$cache = CacheManager::Files();
$banlist = $cache->get('banlist');
// $cache->clean();
if (is_null($banlist)) {
$banlist = array(getBanlist(), date('d-m-Y H:i:s'));
$cache->set('banlist', $banlist, 600);
} }
$banlist = $cacheutils->getValue();
?> ?>
<div class="panel panel-default"> <div class="panel panel-default">

3
cache/.htaccess vendored

@ -0,0 +1,3 @@
order deny,allow
deny from all
allow from 127.0.0.1

@ -1,23 +1,14 @@
<?php <?php
require_once __DIR__ . "/tsutils.php"; require_once __DIR__ . "/tsutils.php";
require_once __DIR__ . "/../lib/phpfastcache/autoload.php"; require_once __DIR__ . "/cacheutils.class.php";
$cacheutils = new CacheUtils('adminlist');
use phpFastCache\Util; if($cacheutils->isExpired()) {
use phpFastCache\CacheManager; $cacheutils->setValue([getAdminList(), date('d-m-Y H:i:s')], 30);
Util\Languages::setEncoding("UTF-8");
$cache = CacheManager::Files();
$adminlist = $cache->get('adminlist');
// $cache->clean();
if (is_null($adminlist)) {
$adminlist = array(getAdminList(), date('d-m-Y H:i:s'));
$cache->set('adminlist', $adminlist, 30);
} }
$adminlist = $cacheutils->getValue();
// FUNCTIONS // FUNCTIONS

@ -0,0 +1,49 @@
<?php
require_once __DIR__ . "/../lib/phpfastcache/src/autoload.php";
use phpFastCache\CacheManager;
use phpFastCache\Util\Languages;
class CacheUtils {
private $cacheInstance;
private $cacheItem;
private $key;
function __construct($key) {
if(!is_string($key))
throw new InvalidArgumentException("Key must be a string");
$this->cacheInstance = CacheManager::getInstance('Files', ["path" => __DIR__ . '/../cache']);
Languages::setEncoding();
$this->cacheItem = $this->cacheInstance->getItem($key);
$this->key = $key;
}
public function getCacheInstance() {
return $this->cacheInstance;
}
public function getCacheItem() {
return $this->cacheItem;
}
public function getValue() {
return $this->cacheItem->get();
}
public function setValue($value, $expireTime) {
$this->cacheItem = $this->cacheItem->set($value)->expiresAfter($expireTime);
$this->cacheInstance->save($this->cacheItem);
}
public function isExpired() {
return !$this->cacheItem->isHit();
}
public function remove() {
$this->cacheInstance->deleteItem($this->key);
}
}

@ -12,7 +12,7 @@
<ul class="list-inline"> <ul class="list-inline">
<li> <!-- Please respect the amount of work we've put for free into this project and leave the authors in the footer. Thank you. --> <li> <!-- Please respect the amount of work we've put for free into this project and leave the authors in the footer. Thank you. -->
<p> <p>
<a href="https://github.com/Wruczek/ts-website">ts-website</a> v 1.3.7 &mdash; &copy; <a href="https://wruczek.tech">Wruczek</a> 2016 - 2017 <a href="https://github.com/Wruczek/ts-website">ts-website</a> v 1.4.0 &mdash; &copy; <a href="https://wruczek.tech">Wruczek</a> 2016 - 2017
</p> </p>
<p> <p>

@ -14,7 +14,8 @@ if (!isPHPVersionSupported()) {
$text = '<p>You are using old, unsupported PHP version.</p><p>Your PHP version: <b>' . phpversion() . '</b>, required PHP version: <b>5.5.0</b>.</p><p>Please update your PHP installation and try again.</p>'; $text = '<p>You are using old, unsupported PHP version.</p><p>Your PHP version: <b>' . phpversion() . '</b>, required PHP version: <b>5.5.0</b>.</p><p>Please update your PHP installation and try again.</p>';
die(showError($title, $text)); showError($title, $text);
die();
} }
if (!function_exists("utf8_encode")) { if (!function_exists("utf8_encode")) {
@ -24,18 +25,15 @@ if (!function_exists("utf8_encode")) {
<p>For PHP 7.0 (recommended), install this package: <code>sudo apt-get install php-xml php7.0-xml</code> and <u>restart apache</u>. Otherwise, installation instructions can be found <a href="https://www.google.com/?q=Call%20to%20undefined%20function%20utf8_encode()">on Google</a> ;)</p> <p>For PHP 7.0 (recommended), install this package: <code>sudo apt-get install php-xml php7.0-xml</code> and <u>restart apache</u>. Otherwise, installation instructions can be found <a href="https://www.google.com/?q=Call%20to%20undefined%20function%20utf8_encode()">on Google</a> ;)</p>
<p>If you are using Web Hosting service, please contact the Hosting support for instruction on enabling needed packages.</p>'; <p>If you are using Web Hosting service, please contact the Hosting support for instruction on enabling needed packages.</p>';
die(showError($title, $text)); showError($title, $text);
die();
} }
try { if(!is_writable(__DIR__ . '/../cache')) {
require_once __DIR__ . "/../lib/phpfastcache/autoload.php"; $title = 'Cache directory is not writable';
\phpFastCache\CacheManager::Files(); $text = '<p>Please make sure that the <code>cache</code> directory is fully writable.</p>';
} catch (\phpFastCache\Exceptions\phpFastCacheDriverException $e) { showError($title, $text);
$title = 'Directory is not writable'; die();
$text = '<p>Please make sure that the whole website directory including subdirectories is fully writable.</p>';
die(showError($title, $text));
} }
if (!file_exists(__DIR__ . "/../config/config.php")) { if (!file_exists(__DIR__ . "/../config/config.php")) {
@ -44,7 +42,8 @@ if (!file_exists(__DIR__ . "/../config/config.php")) {
$text = '<p>Please go into the directory <code>config</code> and rename <code>config.template.php</code> to <code>config.php</code>.</p> $text = '<p>Please go into the directory <code>config</code> and rename <code>config.template.php</code> to <code>config.php</code>.</p>
<p>Edit the new file and tweak it to suite your needs.</p>'; <p>Edit the new file and tweak it to suite your needs.</p>';
die(showError($title, $text)); showError($title, $text);
die();
} }
@ -90,7 +89,7 @@ function showError($title, $text) { ?>
<?php echo $text; ?> <?php echo $text; ?>
</div> </div>
<div class="panel-footer"> <div class="panel-footer">
&copy; <a href="https://wruczek.tech">Wruczek</a> 2016 - 2017 | <a href="https://github.com/Wruczek/ts-website">ts-website</a> v 1.3.7 | MIT License &copy; <a href="https://wruczek.tech">Wruczek</a> 2016 - 2017 | <a href="https://github.com/Wruczek/ts-website">ts-website</a> v 1.4.0 | MIT License
</div> </div>
</div> </div>

@ -1208,7 +1208,7 @@ class Parsedown
$remainder = $Excerpt['text']; $remainder = $Excerpt['text'];
if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches))
{ {
$Element['text'] = $matches[1]; $Element['text'] = $matches[1];
@ -1221,7 +1221,7 @@ class Parsedown
return; return;
} }
if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*"|\'[^\']*\'))?\s*[)]/', $remainder, $matches))
{ {
$Element['attributes']['href'] = $matches[1]; $Element['attributes']['href'] = $matches[1];

@ -0,0 +1,20 @@
Copyright (c) 2016 phpFastCache
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
Software), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -0,0 +1,19 @@
Copyright (c) 2015 PHP Framework Interoperability Group
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

@ -0,0 +1,9 @@
PSR Cache
=========
This repository holds all interfaces defined by
[PSR-6](http://www.php-fig.org/psr/psr-6/).
Note that this is not a Cache implementation of its own. It is merely an
interface that describes a Cache implementation. See the specification for more
details.

@ -0,0 +1,25 @@
{
"name": "psr/cache",
"description": "Common interface for caching libraries",
"keywords": ["psr", "psr-6", "cache"],
"license": "MIT",
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-4": {
"Psr\\Cache\\": "src/"
}
},
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
}
}

@ -0,0 +1,10 @@
<?php
namespace Psr\Cache;
/**
* Exception interface for all exceptions thrown by an Implementing Library.
*/
interface CacheException
{
}

@ -0,0 +1,106 @@
<?php
namespace Psr\Cache;
/**
* CacheItemInterface defines an interface for interacting with objects inside a cache.
*
* Each Item object MUST be associated with a specific key, which can be set
* according to the implementing system and is typically passed by the
* Cache\CacheItemPoolInterface object.
*
* The Cache\CacheItemInterface object encapsulates the storage and retrieval of
* cache items. Each Cache\CacheItemInterface is generated by a
* Cache\CacheItemPoolInterface object, which is responsible for any required
* setup as well as associating the object with a unique Key.
* Cache\CacheItemInterface objects MUST be able to store and retrieve any type
* of PHP value defined in the Data section of the specification.
*
* Calling Libraries MUST NOT instantiate Item objects themselves. They may only
* be requested from a Pool object via the getItem() method. Calling Libraries
* SHOULD NOT assume that an Item created by one Implementing Library is
* compatible with a Pool from another Implementing Library.
*
*/
interface CacheItemInterface
{
/**
* Returns the key for the current cache item.
*
* The key is loaded by the Implementing Library, but should be available to
* the higher level callers when needed.
*
* @return string
* The key string for this cache item.
*/
public function getKey();
/**
* Retrieves the value of the item from the cache associated with this object's key.
*
* The value returned must be identical to the value originally stored by set().
*
* If isHit() returns false, this method MUST return null. Note that null
* is a legitimate cached value, so the isHit() method SHOULD be used to
* differentiate between "null value was found" and "no value was found."
*
* @return mixed
* The value corresponding to this cache item's key, or null if not found.
*/
public function get();
/**
* Confirms if the cache item lookup resulted in a cache hit.
*
* Note: This method MUST NOT have a race condition between calling isHit()
* and calling get().
*
* @return bool
* True if the request resulted in a cache hit. False otherwise.
*/
public function isHit();
/**
* Sets the value represented by this cache item.
*
* The $value argument may be any item that can be serialized by PHP,
* although the method of serialization is left up to the Implementing
* Library.
*
* @param mixed $value
* The serializable value to be stored.
*
* @return static
* The invoked object.
*/
public function set($value);
/**
* Sets the expiration time for this cache item.
*
* @param \DateTimeInterface $expiration
* The point in time after which the item MUST be considered expired.
* If null is passed explicitly, a default value MAY be used. If none is set,
* the value should be stored permanently or for as long as the
* implementation allows.
*
* @return static
* The called object.
*/
public function expiresAt($expiration);
/**
* Sets the expiration time for this cache item.
*
* @param int|\DateInterval $time
* The period of time from the present after which the item MUST be considered
* expired. An integer parameter is understood to be the time in seconds until
* expiration. If null is passed explicitly, a default value MAY be used.
* If none is set, the value should be stored permanently or for as long as the
* implementation allows.
*
* @return static
* The called object.
*/
public function expiresAfter($time);
}

@ -0,0 +1,139 @@
<?php
namespace Psr\Cache;
/**
* CacheItemPoolInterface generates CacheItemInterface objects.
*
* The primary purpose of Cache\CacheItemPoolInterface is to accept a key from
* the Calling Library and return the associated Cache\CacheItemInterface object.
* It is also the primary point of interaction with the entire cache collection.
* All configuration and initialization of the Pool is left up to an
* Implementing Library.
*
*/
interface CacheItemPoolInterface
{
/**
* Returns a Cache Item representing the specified key.
*
* This method must always return a CacheItemInterface object, even in case of
* a cache miss. It MUST NOT return null.
*
* @param string $key
* The key for which to return the corresponding Cache Item.
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return CacheItemInterface
* The corresponding Cache Item.
*/
public function getItem($key);
/**
* Returns a traversable set of cache items.
*
* @param array $keys
* An indexed array of keys of items to retrieve.
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return array|\Traversable
* A traversable collection of Cache Items keyed by the cache keys of
* each item. A Cache item will be returned for each key, even if that
* key is not found. However, if no keys are specified then an empty
* traversable MUST be returned instead.
*/
public function getItems(array $keys = array());
/**
* Confirms if the cache contains specified cache item.
*
* Note: This method MAY avoid retrieving the cached value for performance reasons.
* This could result in a race condition with CacheItemInterface::get(). To avoid
* such situation use CacheItemInterface::isHit() instead.
*
* @param string $key
* The key for which to check existence.
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if item exists in the cache, false otherwise.
*/
public function hasItem($key);
/**
* Deletes all items in the pool.
*
* @return bool
* True if the pool was successfully cleared. False if there was an error.
*/
public function clear();
/**
* Removes the item from the pool.
*
* @param string $key
* The key for which to delete
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully removed. False if there was an error.
*/
public function deleteItem($key);
/**
* Removes multiple items from the pool.
*
* @param array $keys
* An array of keys that should be removed from the pool.
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the items were successfully removed. False if there was an error.
*/
public function deleteItems(array $keys);
/**
* Persists a cache item immediately.
*
* @param CacheItemInterface $item
* The cache item to save.
*
* @return bool
* True if the item was successfully persisted. False if there was an error.
*/
public function save(CacheItemInterface $item);
/**
* Sets a cache item to be persisted later.
*
* @param CacheItemInterface $item
* The cache item to save.
*
* @return bool
* False if the item could not be queued or if a commit was attempted and failed. True otherwise.
*/
public function saveDeferred(CacheItemInterface $item);
/**
* Persists any deferred cache items.
*
* @return bool
* True if all not-yet-saved items were successfully saved or there were none. False otherwise.
*/
public function commit();
}

@ -0,0 +1,13 @@
<?php
namespace Psr\Cache;
/**
* Exception interface for invalid cache arguments.
*
* Any time an invalid argument is passed into a method it must throw an
* exception class which implements Psr\Cache\InvalidArgumentException.
*/
interface InvalidArgumentException extends CacheException
{
}

@ -1,173 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache;
use phpFastCache\Core\phpFastCache;
use phpFastCache\Core\DriverAbstract;
/**
* Class CacheManager
* @package phpFastCache
*
* @method static DriverAbstract Apc() Apc($config = array()) Return a driver "apc" instance
* @method static DriverAbstract Cookie() Cookie($config = array()) Return a driver "cookie" instance
* @method static DriverAbstract Files() Files($config = array()) Return a driver "files" instance
* @method static DriverAbstract Memcache() Memcache($config = array()) Return a driver "memcache" instance
* @method static DriverAbstract Memcached() Memcached($config = array()) Return a driver "memcached" instance
* @method static DriverAbstract Predis() Predis($config = array()) Return a driver "predis" instance
* @method static DriverAbstract Redis() Redis($config = array()) Return a driver "redis" instance
* @method static DriverAbstract Sqlite() Sqlite($config = array()) Return a driver "sqlite" instance
* @method static DriverAbstract Ssdb() Ssdb($config = array()) Return a driver "ssdb" instance
* @method static DriverAbstract Wincache() Wincache($config = array()) Return a driver "wincache" instance
* @method static DriverAbstract Xcache() Xcache($config = array()) Return a driver "xcache" instance
*
*/
class CacheManager
{
public static $instances = array();
public static $memory = array();
public static $hit = array();
/**
* @param string $storage
* @param array $config
* @return DriverAbstract
*/
public static function getInstance($storage = 'auto', $config = array())
{
$storage = strtolower($storage);
if (empty($config)) {
$config = phpFastCache::$config;
}
if (!isset($config[ 'cache_method' ])) {
$config[ 'cache_method' ] = phpFastCache::$config[ 'cache_method' ];
}
if (!isset($config[ 'limited_memory_each_object' ])) {
$config[ 'limited_memory_each_object' ] = phpFastCache::$config[ 'limited_memory_each_object' ];
}
if (isset(phpFastCache::$config[ 'overwrite' ]) && !in_array(phpFastCache::$config[ 'overwrite' ], array('auto', ''), true)) {
phpFastCache::$config[ 'storage' ] = phpFastCache::$config[ 'overwrite' ];
$storage = phpFastCache::$config[ 'overwrite' ];
} else if (isset(phpFastCache::$config[ 'storage' ]) && !in_array(phpFastCache::$config[ 'storage' ], array('auto', ''), true)) {
$storage = phpFastCache::$config[ 'storage' ];
} else if (in_array($storage, array('auto', ''), true)) {
$storage = phpFastCache::getAutoClass($config);
}
// echo $storage."<br>";
$instance = md5(serialize($config) . $storage);
if (!isset(self::$instances[ $instance ]) || is_null(self::$instances[ $instance ])) {
$class = '\phpFastCache\Drivers\\' . $storage;
$config[ 'storage' ] = $storage;
$config[ 'instance' ] = $instance;
$config[ 'class' ] = $class;
if (!isset(self::$memory[ $instance ])) {
self::$memory[ $instance ] = array();
}
if (!isset(self::$hit[ $instance ])) {
self::$hit[ $instance ] = array(
"class" => $class,
"storage" => $storage,
"data" => array(),
);
if ($config[ 'cache_method' ] == 4) {
register_shutdown_function('phpFastCache\CacheManager::cleanCachingMethod', null);
}
}
self::$instances[ $instance ] = new $class($config);
}
return self::$instances[ $instance ];
}
/**
* Setup Method
* @param string $string | traditional(normal), memory (fast), phpfastcache (fastest)
*/
public static function CachingMethod($string = "phpFastCache")
{
$string = strtolower($string);
if (in_array($string, array("normal", "traditional"))) {
phpFastCache::$config[ 'cache_method' ] = 1;
} else if (in_array($string, array("fast", "memory"))) {
phpFastCache::$config[ 'cache_method' ] = 2;
} else if (in_array($string, array("fastest", "phpfastcache"))) {
phpFastCache::$config[ 'cache_method' ] = 3;
} else if (in_array($string, array("superfast", "phpfastcachex"))) {
phpFastCache::$config[ 'cache_method' ] = 4;
}
}
/**
* CacheManager::Files();
* CacheManager::Memcached();
* CacheManager::get($keyword);
* CacheManager::set(), touch, other @method supported
*/
public static function __callStatic($name, $arguments)
{
$driver = strtolower($name);
if (!isset(self::$instances[ 'loaded' ][ $driver ]) && class_exists("\\phpFastCache\\Drivers\\{$driver}")) {
self::$instances[ 'loaded' ][ $driver ] = true;
}
if (isset(self::$instances[ 'loaded' ][ $driver ])) {
return self::getInstance($name, (isset($arguments[ 0 ]) ? $arguments[ 0 ] : array()));
} else {
return call_user_func_array(array(self::getInstance(), $name), $arguments);
}
}
/**
* Shortcut to phpFastCache::setup()
*/
public static function setup($name, $value = '')
{
phpFastCache::setup($name, $value);
}
/**
* @param string $instance
*/
public static function cleanCachingMethod($instance = null)
{
if (is_null($instance)) {
foreach (self::$instances as $instance => $data) {
self::__CleanCachingMethod($instance);
unset($data);
}
} else {
self::__CleanCachingMethod($instance);
}
}
/**
* @param string $instance
*/
protected static function __CleanCachingMethod($instance)
{
if(is_array(self::$memory[ $instance ]) && !empty(self::$memory[ $instance ])) {
$old = self::$instances[$instance]->config['cache_method'];
self::$instances[$instance]->config['cache_method'] = 1;
foreach (self::$memory[$instance] as $keyword => $object) {
self::$instances[$instance]->set($keyword, $object['value'], $object['expired_in']);
}
self::$instances[$instance]->config['cache_method'] = $old;
self::$memory[$instance] = array();
}
}
}

@ -1,846 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpFastCache\CacheManager;
/**
* Class DriverAbstract
* @package phpFastCache\Core
*/
abstract class DriverAbstract implements DriverInterface
{
/**
* @var array
*/
public $extension_dir = '_extensions';
/**
* @var array
*/
public $tmp = array();
/**
* @var array default options, this will be merge to Driver's Options
*/
public $config = array();
/**
* @var bool
*/
public $fallback = false;
/**
* @var
*/
public $instant;
public function __destruct()
{
// clean up the memory and don't want for PHP clean for caching method "phpfastcache"
if (isset($this->config[ 'instance' ]) && (int)$this->config[ 'cache_method' ] === 3) {
CacheManager::cleanCachingMethod($this->config[ 'instance' ]);
}
}
/**
* @param $keyword
* @return string
*/
protected function encodeFilename($keyword)
{
// return trim(trim(preg_replace('/[^a-zA-Z0-9]+/', '_', $keyword), '_'));
// return rtrim(base64_encode($keyword), '=');
return md5($keyword);
}
/**
* Basic Functions
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool|null
*/
public function set($keyword, $value = '', $time = 0, $option = array())
{
/**
* Infinity Time
* Khoa. B
*/
if ((int)$time <= 0) {
/**
* 5 years, however memcached or memory cached will gone when u restart it
* just recommended for sqlite. files
*/
$time = 3600 * 24 * 365 * 5;
}
/**
* Temporary disabled phpFastCache::$disabled = true
* Khoa. B
*/
if (phpFastCache::$disabled === true) {
return false;
}
$object = array(
"value" => $value,
"write_time" => time(),
"expired_in" => $time,
"expired_time" => time() + (int)$time,
"size" => (is_array($value) || is_object($value)) ? strlen(serialize($value)) : strlen((String)$value),
);
// handle search
if (isset($this->config[ 'allow_search' ]) && $this->config[ 'allow_search' ] == true) {
$option[ 'tags' ][] = "search";
}
// handle tags
if (isset($option[ 'tags' ])) {
$this->_handleTags($keyword, $time, $option[ 'tags' ]);
}
// handle method
if ((int)$this->config[ 'cache_method' ] > 1 && isset($object[ 'size' ]) && (int)$object[ 'size' ] <= (int)$this->config[ 'limited_memory_each_object' ]) {
CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ] = $object;
if (in_array((int)$this->config[ 'cache_method' ], array(3, 4))) {
return true;
}
}
$this->_hit("set", 1);
return $this->driver_set($keyword, $object, $time, $option);
}
/**
* @param $keyword
* @param array $option
* @return mixed
*/
public function get($keyword, $option = array())
{
/**
* Temporary disabled phpFastCache::$disabled = true
* Khoa. B
*/
if (phpFastCache::$disabled === true) {
return null;
}
// handle method
if ((int)$this->config[ 'cache_method' ] > 1) {
if (isset(CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ])) {
$object = CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ];
}
}
if (!isset($object)) {
$this->_hit("get", 1);
$object = $this->driver_get($keyword, $option);
// handle method
if ((int)$this->config[ 'cache_method' ] > 1 && isset($object[ 'size' ]) && (int)$object[ 'size' ] <= (int)$this->config[ 'limited_memory_each_object' ]) {
CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ] = $object;
}
// end handle method
}
if ($object == null) {
return null;
}
$value = isset($object[ 'value' ]) ? $object[ 'value' ] : null;
return isset($option[ 'all_keys' ]) && $option[ 'all_keys' ] ? $object : $value;
}
/**
* @param $keyword
* @param array $option
* @return null|object
*/
public function getInfo($keyword, $option = array())
{
if ((int)$this->config[ 'cache_method' ] > 1) {
if (isset(CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ])) {
$object = CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ];
}
}
if (!isset($object)) {
$object = $this->driver_get($keyword, $option);
}
if ($object == null) {
return null;
}
return $object;
}
/**
* @param $keyword
* @param array $option
* @return mixed
*/
public function delete($keyword, array $option = array())
{
// handle method
if ((int)$this->config[ 'cache_method' ] > 1) {
// use memory
unset(CacheManager::$memory[ $this->config[ 'instance' ] ][ $keyword ]);
}
// end handle method
return $this->driver_delete($keyword, $option);
}
/**
* @param array $option
* @return mixed
*/
public function stats(array $option = array())
{
return $this->driver_stats($option);
}
/**
* @param array $option
* @return mixed
*/
public function clean(array $option = array())
{
// handle method
if ((int)$this->config[ 'cache_method' ] > 1) {
// use memory
CacheManager::$memory[ $this->config[ 'instance' ] ] = array();
}
// end handle method
return $this->driver_clean($option);
}
/**
* @param $keyword
* @return bool
*/
public function isExisting($keyword)
{
if (method_exists($this, 'driver_isExisting')) {
return $this->driver_isExisting($keyword);
}
$data = $this->get($keyword);
if ($data == null) {
return false;
} else {
return true;
}
}
/**
* Searches though the cache for keys that match the given query.
* @param $query_as_regex_or_string
* @param bool $search_in_value
* @return mixed
* @throws phpFastCacheDriverException
*/
public function search($query_as_regex_or_string, $search_in_value = false)
{
if ($this->config[ 'allow_search' ] != true) {
throw new phpFastCacheDriverException('Please setup allow_search = true');
} else {
$list = $this->getTags("search", $search_in_value);
$tmp = explode("/", $query_as_regex_or_string, 2);
$regex = isset($tmp[ 1 ]) ? true : false;
$return_list = array();
foreach ($list as $tag) {
foreach ($tag as $keyword => $value) {
$gotcha = false;
if ($search_in_value == true) {
$value = $this->get($keyword);
}
if ($regex == true && $gotcha == false) { // look in keyword
if (preg_match($query_as_regex_or_string, $keyword)) {
$return_list[ $keyword ] = $value;
$gotcha = true;
}
}
if ($gotcha == false) {
if (strpos($keyword, $query_as_regex_or_string) !== false) {
$return_list[ $keyword ] = $value;
$gotcha = true;
}
}
if ($search_in_value == true && $gotcha == false) { // value search
if ($regex == true && $gotcha == false) {
if (preg_match($query_as_regex_or_string, $value)) {
$return_list[ $keyword ] = $value;
$gotcha = true;
}
}
if ($gotcha == false) {
if (strpos($value, $query_as_regex_or_string) !== false) {
$return_list[ $keyword ] = $value;
$gotcha = true;
}
}
}
} // each tags loop
} // end foreach
return $return_list;
}
}
/**
* @param $keyword
* @param int $step
* @param array $option
* @return bool
*/
public function increment($keyword, $step = 1, array $option = array())
{
$object = $this->get($keyword, array('all_keys' => true));
if ($object == null) {
return false;
} else {
$value = (int)$object[ 'value' ] + (int)$step;
$time = $object[ 'expired_time' ] - time();
$this->set($keyword, $value, $time, $option);
return true;
}
}
/**
* @param $keyword
* @param int $step
* @param array $option
* @return bool
*/
public function decrement($keyword, $step = 1, array $option = array())
{
$object = $this->get($keyword, array('all_keys' => true));
if ($object == null) {
return false;
} else {
$value = (int)$object[ 'value' ] - (int)$step;
$time = $object[ 'expired_time' ] - time();
$this->set($keyword, $value, $time, $option);
return true;
}
}
/**
* Extend more time
* @param $keyword
* @param int $time
* @param array $option
* @return bool
*/
public function touch($keyword, $time = 300, array $option = array())
{
$object = $this->get($keyword, array('all_keys' => true));
if ($object == null) {
return false;
} else {
$value = $object[ 'value' ];
$time = $object[ 'expired_time' ] - time() + $time;
$this->set($keyword, $value, $time, $option);
return true;
}
}
/**
* Other Functions Built-int for phpFastCache since 1.3
*/
/**
* @param array $list
*/
public function setMulti(array $list = array())
{
foreach ($list as $array) {
$this->set($array[ 0 ], isset($array[ 1 ]) ? $array[ 1 ] : 0,
isset($array[ 2 ]) ? $array[ 2 ] : array());
}
}
/**
* @param array $list
* @return array
*/
public function getMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->get($name,
isset($array[ 1 ]) ? $array[ 1 ] : array());
}
return $res;
}
/**
* @param array $list
* @return array
*/
public function getInfoMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->getInfo($name,
isset($array[ 1 ]) ? $array[ 1 ] : array());
}
return $res;
}
/**
* @param array $list
* @param array $option
*/
public function deleteMulti(array $list = array(), array $option = array())
{
foreach ($list as $item) {
if (is_array($item) && count($item) === 2) {
$this->delete($item[ 0 ], $item[ 1 ]);
}
}
}
/**
* @param array $list
* @return array
*/
public function isExistingMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->isExisting($name);
}
return $res;
}
/**
* @param array $list
* @return array
*/
public function incrementMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->increment($name, $array[ 1 ],
isset($array[ 2 ]) ? $array[ 2 ] : array());
}
return $res;
}
/**
* @param array $list
* @return array
*/
public function decrementMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->decrement($name, $array[ 1 ],
isset($array[ 2 ]) ? $array[ 2 ] : array());
}
return $res;
}
/**
* @param array $list
* @return array
*/
public function touchMulti(array $list = array())
{
$res = array();
foreach ($list as $array) {
$name = $array[ 0 ];
$res[ $name ] = $this->touch($name, $array[ 1 ],
isset($array[ 2 ]) ? $array[ 2 ] : array());
}
return $res;
}
/**
* @param $config_name
* @param string $value
*/
public function setup($config_name, $value = '')
{
/*
* Config for class
*/
if (is_array($config_name)) {
$this->config = array_merge($this->config, $config_name);
} else {
$this->config[ $config_name ] = $value;
}
}
/**
* @param int $time
*/
public function autoCleanExpired($time = 3600)
{
}
/**
* Magic methods
*/
/**
* @param $name
* @return mixed
*/
public function __get($name)
{
return $this->get($name);
}
/**
* @param $name
* @param $v
* @return bool|null
* @throws \Exception
*/
public function __set($name, $v)
{
if (isset($v[ 1 ]) && is_scalar($v[ 1 ])) {
return $this->set($name, $v[ 0 ], $v[ 1 ],
isset($v[ 2 ]) ? $v[ 2 ] : array());
} else {
throw new phpFastCacheDriverException("Example ->$name = array('VALUE', 300);", 98);
}
}
/**
* Base Methods
*/
/**
* @return mixed
*/
protected function backup()
{
return phpFastCache(phpFastCache::$config[ 'fallback' ]);
}
/**
* @param $name
* @return void
*/
protected function required_extension($name)
{
require_once(__DIR__ . '/../' . $this->extension_dir . '/' . $name . '.' . PHP_EXT);
}
/**
* @param $file
* @return string
* @throws \Exception
*/
protected function readfile($file)
{
if (function_exists('file_get_contents')) {
return file_get_contents($file);
} else {
$string = '';
$file_handle = @fopen($file, 'r');
if (!$file_handle) {
throw new phpFastCacheDriverException("Can't Read File", 96);
}
while (!feof($file_handle)) {
$line = fgets($file_handle);
$string .= $line;
}
fclose($file_handle);
return $string;
}
}
/**
* return PATH for Files & PDO only
* @param bool $create_path
* @return string
* @throws \Exception
*/
public function getPath($create_path = false)
{
return phpFastCache::getPath($create_path, $this->config);
}
/**
* Object for Files & SQLite
* @param $data
* @return string
*/
protected function encode($data)
{
return serialize($data);
}
/**
* @param $value
* @return mixed
*/
protected function decode($value)
{
$x = @unserialize($value);
if ($x == false) {
return $value;
} else {
return $x;
}
}
/**
* Check phpModules or CGI
* @return bool
*/
protected function isPHPModule()
{
return phpFastCache::isPHPModule();
}
/**
* @param $class
* @return bool
*/
protected function isExistingDriver($class)
{
return class_exists("\\phpFastCache\\Drivers\\{$class}");
}
/**
* @return int
*/
protected function __setChmodAuto()
{
return phpFastCache::__setChmodAuto($this->config);
}
/**
* @param $tag
* @return string
*/
protected function _getTagName($tag)
{
return "__tag__" . $tag;
}
/**
* @return \phpFastCache\Core\DriverAbstract
*/
protected function _tagCaching()
{
return CacheManager::Sqlite(
array(
"path" => $this->config[ 'path' ],
"cache_method" => 3,
)
);
}
/**
* @param string $keyword
* @param mixed $value
* @param integer $time
* @param array $tags
* @param array $option | $option = array("tags" => array("a","b","c")
* @return mixed
*/
public function setTags($keyword, $value = '', $time = 0, $tags = array(), $option = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$option[ 'tags' ] = $tags;
return $this->set($keyword, $value, $time, $option);
}
protected function _handleTags($keyword, $time, $tags)
{
foreach ($tags as $tag) {
$list = $this->_tagCaching()->get($this->_getTagName($tag));
if (is_null($list)) {
$list = array();
}
$list[ $keyword ] = time() + $time;
$this->_tagCaching()->set($this->_getTagName($tag), $list, 3600 * 24 * 30);
}
}
/**
* @param array $tags
* @param bool $return_content
* @param array $option | $option = array("tags" => array("a","b","c")
* @return array
*/
public function getTags($tags = array(), $return_content = true, $option = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$keywords = array();
$tmp = 0;
foreach ($tags as $tag) {
$list = $this->_tagCaching()->get($this->_getTagName($tag));
$list_return = array();
if (is_null($list)) {
$list = array();
}
foreach ($list as $keyword => $time) {
if ($time <= time()) {
unset($list[ $keyword ]);
} else {
if ($tmp < $time) {
$tmp = $time;
}
if ($return_content == true) {
$list_return[ $keyword ] = $this->get($keyword);
} else {
$list_return[ $keyword ] = $time;
}
}
}
$this->_tagCaching()->set($this->_getTagName($tag), $list, $tmp);
$keywords[ $tag ] = $list_return;
}
return $keywords;
}
/**
* @param array $tags | array("a","b","c")
* @param int $time
* @param array $options
* @return mixed
* @internal param array $option | $option = array("tags" => array("a","b","c")
*/
public function touchTags($tags = array(), $time = 300, $options = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$lists = $this->getTags($tags);
foreach ($lists as $tag => $keywords) {
foreach ($keywords as $keyword => $time) {
$this->touch($keyword, $time, $options);
}
}
return true;
}
/**
* @param array $tags | array("a","b","c")
* @param array $option | $option = array("tags" => array("a","b","c")
* @return mixed
*/
public function deleteTags($tags = array(), $option = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$lists = $this->getTags($tags);
foreach ($lists as $tag => $keywords) {
foreach ($keywords as $keyword => $time) {
$this->delete($keyword, $option);
}
}
return true;
}
/**
* @param array $tags | array("a","b","c")
* @param integer
* @param array $option | $option = array("tags" => array("a","b","c")
* @return mixed
*/
public function incrementTags($tags = array(), $step = 1, $option = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$lists = $this->getTags($tags);
foreach ($lists as $tag => $keywords) {
foreach ($keywords as $keyword => $time) {
$this->increment($keyword, $step, $option);
}
}
return true;
}
/**
* @param array $tags | array("a","b","c")
* @param integer
* @param array $option | $option = array("tags" => array("a","b","c")
* @return mixed
*/
public function decrementTags($tags = array(), $step = 1, $option = array())
{
if (!is_array($tags)) {
$tags = array($tags);
}
$lists = $this->getTags($tags);
foreach ($lists as $tag => $keywords) {
foreach ($keywords as $keyword => $time) {
$this->decrement($keyword, $step, $option);
}
}
return true;
}
/**
* @param $value
*/
protected function _kbdebug($value)
{
/*
echo "<pre>";
print_r($value);
echo "</pre>";
*/
}
public function _hit($index, $step = 1)
{
$instance = $this->config[ 'instance' ];
$current = isset(CacheManager::$hit[ $instance ][ 'data' ][ $index ]) ? CacheManager::$hit[ $instance ][ 'data' ][ $index ] : 0;
CacheManager::$hit[ $instance ][ 'data' ][ $index ] = $current + ($step);
}
}

@ -1,86 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
/**
* Interface DriverInterface
* @package phpFastCache\Core
*/
interface DriverInterface
{
/**
* Check if this Cache driver is available for server or not
* phpFastCache_driver constructor.
* @param array $config
*/
public function __construct($config = array());
/**
* @return mixed
*/
public function checkdriver();
/**
* Set a obj to cache
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return mixed
*/
public function driver_set(
$keyword,
$value = '',
$time = 300,
$option = array()
);
/**
* Return null or value of cache
* @param $keyword
* @param array $option
* @return mixed
*/
public function driver_get($keyword, $option = array());
/**
* Show stats of caching
* Return array("info","size","data")
* @param array $option
* @return mixed
*/
public function driver_stats($option = array());
/**
* Delete a cache
* @param $keyword
* @param array $option
* @return mixed
*/
public function driver_delete($keyword, $option = array());
/**
* Clean up whole cache
* @param array $option
* @return mixed
*/
public function driver_clean($option = array());
/**
* @param $config_name
* @param string $value
*/
public function setup($config_name, $value = '');
}

@ -1,354 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use phpFastCache\CacheManager;
use phpFastCache\Exceptions\phpFastCacheCoreException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class phpFastCache
* @package phpFastCache\Core
*
* Handle methods using annotations for IDE
* because they're handled by __call()
* Check out DriverInterface to see all
* the drivers methods magically implemented
*
* @method get() driver_get($keyword, $option = array()) Return null or value of cache
* @method set() driver_set($keyword, $value = '', $time = 300, $option = array()) Set a obj to cache
* @method delete() delete(string $keyword) Delete key from cache
* @method clean() clean($option = array()) Clean up whole cache
* @method checkdriver() checkdriver() Delete key from cache
* @method stats() stats($option = array()) Show stats of caching
* @method systemInfo() systemInfo() Return System Information
*
*/
class phpFastCache
{
/**
* @var bool
*/
public static $disabled = false;
/**
* @var array
*/
public static $config = array(
'storage' => '', // blank for auto
'default_chmod' => 0777, // 0777 , 0666, 0644
'overwrite' => "", // files, sqlite, etc it will overwrite ur storage and all other caching for waiting u fix ur server
'allow_search' => false, // turn to true will allow $method search("/regex/")
'fallback' => 'files', //Fall back when old driver is not support
'securityKey' => 'auto',
'htaccess' => true,
'path' => '',
'memcache' => array(
array('127.0.0.1', 11211, 1),
// array("new.host.ip",11211,1),
),
'redis' => array(
'host' => '127.0.0.1',
'port' => '',
'password' => '',
'database' => '',
'timeout' => '',
),
'ssdb' => array(
'host' => '127.0.0.1',
'port' => 8888,
'password' => '',
'timeout' => '',
),
'extensions' => array(),
"cache_method" => 1, // 1 = normal, 2 = phpfastcache, 3 = memory
"limited_memory_each_object" => 4000, // maximum size (bytes) of object store in memory
"compress_data" => false // compress stored data, if the backend supports it
);
/**
* @var array
*/
protected static $tmp = array();
/**
* @var DriverAbstract $instance
*/
public $instance;
/**
* phpFastCache constructor.
* @param string $storage
* @param array $config
*/
public function __construct($storage = '', $config = array())
{
if (empty($config)) {
$config = phpFastCache::$config;
}
$config[ 'storage' ] = $storage;
$storage = strtolower($storage);
if ($storage == '' || $storage == 'auto') {
$storage = self::getAutoClass($config);
}
$this->instance = CacheManager::getInstance($storage, $config);
}
/**
* Cores
*/
/**
* @param $config
* @return string
* @throws \Exception
*/
public static function getAutoClass($config)
{
$path = self::getPath(false, $config);
if (is_writable($path)) {
$driver = 'files';
} else if (extension_loaded('apc') && ini_get('apc.enabled') && strpos(PHP_SAPI, 'CGI') === false) {
$driver = 'apc';
} else if (class_exists('memcached')) {
$driver = 'memcached';
} elseif (extension_loaded('wincache') && function_exists('wincache_ucache_set')) {
$driver = 'wincache';
} elseif (extension_loaded('xcache') && function_exists('xcache_get')) {
$driver = 'xcache';
} else if (function_exists('memcache_connect')) {
$driver = 'memcache';
} else if (class_exists('Redis')) {
$driver = 'redis';
} else {
$driver = 'files';
}
return $driver;
}
/**
* @param bool $skip_create_path
* @param $config
* @return string
* @throws \Exception
*/
public static function getPath($skip_create_path = false, $config)
{
$tmp_dir = ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir();
if (!isset($config[ 'path' ]) || $config[ 'path' ] == '') {
if (self::isPHPModule()) {
$path = $tmp_dir;
} else {
$document_root_path = rtrim($_SERVER[ 'DOCUMENT_ROOT' ], '/') . '/../';
$path = isset($_SERVER[ 'DOCUMENT_ROOT' ]) && is_writable($document_root_path)
? $document_root_path
: rtrim(__DIR__, '/') . '/';
}
if (self::$config[ 'path' ] != '') {
$path = $config[ 'path' ];
}
} else {
$path = $config[ 'path' ];
}
$securityKey = array_key_exists('securityKey',
$config) ? $config[ 'securityKey' ] : '';
if ($securityKey == "" || $securityKey == 'auto') {
$securityKey = self::$config[ 'securityKey' ];
if ($securityKey == 'auto' || $securityKey == '') {
$securityKey = isset($_SERVER[ 'HTTP_HOST' ]) ? preg_replace('/^www./',
'', strtolower(str_replace(':', '_', $_SERVER[ 'HTTP_HOST' ]))) : "default";
}
}
if ($securityKey != '') {
$securityKey .= '/';
}
$securityKey = self::cleanFileName($securityKey);
$full_path = rtrim($path,'/') . '/' . $securityKey;
$full_pathx = md5($full_path);
if ($skip_create_path == false && !isset(self::$tmp[ $full_pathx ])) {
if (!@file_exists($full_path) || !@is_writable($full_path)) {
if (!@file_exists($full_path)) {
@mkdir($full_path, self::__setChmodAuto($config), true);
}
if (!@is_writable($full_path)) {
@chmod($full_path, self::__setChmodAuto($config));
}
if(!@is_writable($full_path)) {
// switch back to tmp dir again if the path is not writeable
$full_path = rtrim($tmp_dir,'/') . '/' . $securityKey;
if (!@file_exists($full_path)) {
@mkdir($full_path, self::__setChmodAuto($config), true);
}
if (!@is_writable($full_path)) {
@chmod($full_path, self::__setChmodAuto($config));
}
}
if (!@file_exists($full_path) || !@is_writable($full_path)) {
throw new phpFastCacheCoreException('PLEASE CREATE OR CHMOD ' . $full_path . ' - 0777 OR ANY WRITABLE PERMISSION!', 92);
}
}
self::$tmp[ $full_pathx ] = true;
self::htaccessGen($full_path, array_key_exists('htaccess', $config) ? $config[ 'htaccess' ] : false);
}
return realpath($full_path);
}
/**
* @param $filename
* @return mixed
*/
public static function cleanFileName($filename)
{
$regex = array(
'/[\?\[\]\/\\\=\<\>\:\;\,\'\"\&\$\#\*\(\)\|\~\`\!\{\}]/',
'/\.$/',
'/^\./',
);
$replace = array('-', '', '');
return trim(preg_replace($regex, $replace, trim($filename)),'-');
}
/**
* @param $config
* @return int
*/
public static function __setChmodAuto($config)
{
if (!isset($config[ 'default_chmod' ]) || $config[ 'default_chmod' ] == '' || is_null($config[ 'default_chmod' ])) {
return 0777;
} else {
return $config[ 'default_chmod' ];
}
}
/**
* @return array
*/
protected static function getOS()
{
$os = array(
'os' => PHP_OS,
'php' => PHP_SAPI,
'system' => php_uname(),
'unique' => md5(php_uname() . PHP_OS . PHP_SAPI),
);
return $os;
}
/**
* @return bool
*/
public static function isPHPModule()
{
if (PHP_SAPI === 'apache2handler') {
return true;
} else {
if (strpos(PHP_SAPI, 'handler') !== false) {
return true;
}
}
return false;
}
/**
* @param $path
* @param bool $create
* @throws \Exception
*/
protected static function htaccessGen($path, $create = true)
{
if ($create == true) {
if (!is_writable($path)) {
try {
chmod($path, 0777);
} catch (phpFastCacheDriverException $e) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $path . ' - 0777 OR ANY WRITABLE PERMISSION!',
92);
}
}
if(!file_exists($path."/.htaccess")) {
// echo "write me";
$html = "order deny, allow \r\n
deny from all \r\n
allow from 127.0.0.1";
$f = @fopen($path . '/.htaccess', 'w+');
if (!$f) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $path . ' - 0777 OR ANY WRITABLE PERMISSION!', 92);
}
fwrite($f, $html);
fclose($f);
}
}
}
/**
* @param $name
* @param string $value
*/
public static function setup($name, $value = '')
{
if (is_array($name)) {
self::$config = array_merge(self::$config,$name);
} else {
self::$config[ $name ] = $value;
}
}
/**
* @param $something
*/
public static function debug($something)
{
echo "Starting Debugging ...<br>\r\n ";
if (is_array($something)) {
echo '<pre>';
print_r($something);
echo '</pre>';
var_dump($something);
} else {
echo $something;
}
echo "\r\n<br> Ended";
exit;
}
}

@ -1,137 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class apc
* @package phpFastCache\Drivers
*/
class apc extends DriverAbstract
{
/**
* phpFastCache_apc constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver()) {
throw new phpFastCacheDriverException('APC is not installed, cannot continue.');
}
}
/**
* @return bool
*/
public function checkdriver()
{
if (extension_loaded('apc') && ini_get('apc.enabled')) {
return true;
} else {
$this->fallback = true;
return false;
}
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return array|bool
*/
public function driver_set(
$keyword,
$value = '',
$time = 300,
$option = array()
) {
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
return apc_add($keyword, $value, $time);
} else {
return apc_store($keyword, $value, $time);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
$data = apc_fetch($keyword, $bo);
if ($bo === false) {
return null;
}
return $data;
}
/**
* @param $keyword
* @param array $option
* @return bool|\string[]
*/
public function driver_delete($keyword, $option = array())
{
return apc_delete($keyword);
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
try {
$res[ 'data' ] = apc_cache_info('user');
} catch (\Exception $e) {
$res[ 'data' ] = array();
}
return $res;
}
/**
* @param array $option
* @return void
*/
public function driver_clean($option = array())
{
@apc_clear_cache();
@apc_clear_cache('user');
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
return (bool) apc_exists($keyword);
}
}

@ -1,156 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
/**
* Class cookie
* @package phpFastCache\Drivers
*/
class cookie extends DriverAbstract
{
/**
* phpFastCache_cookie constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check memcache
if (function_exists('setcookie')) {
return true;
}
$this->fallback = true;
return false;
}
/**
*
*/
public function connectServer()
{
// for cookie check output
if (!isset($_COOKIE[ 'phpFastCache' ])) {
if (!@setcookie('phpFastCache', 1, 10)) {
$this->fallback = true;
}
}
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
$this->connectServer();
$keyword = 'phpFastCache_' . $keyword;
$v = $this->encode($value);
if(isset($this->config['limited_memory_each_object'])
&& strlen($v) > $this->config['limited_memory_each_object']) {
return false;
}
return setcookie($keyword, $v, time() + ($time ? (int)$time : 300), '/');
}
/**
* @param $keyword
* @param array $option
* @return bool|mixed|null
*/
public function driver_get($keyword, $option = array())
{
$this->connectServer();
// return null if no caching
// return value if in caching
$keyword = 'phpFastCache_' . $keyword;
$x = isset($_COOKIE[ $keyword ]) ? $this->decode($_COOKIE[ $keyword ]) : false;
if ($x == false) {
return null;
} else {
return $x;
}
}
/**
* @param $keyword
* @param array $option
*/
public function driver_delete($keyword, $option = array())
{
$this->connectServer();
$keyword = 'phpFastCache_' . $keyword;
@setcookie($keyword, null, -10);
$_COOKIE[ $keyword ] = null;
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$this->connectServer();
$res = array(
'info' => '',
'size' => '',
'data' => $_COOKIE,
);
return $res;
}
/**
* @param array $option
*/
public function driver_clean($option = array())
{
$this->connectServer();
foreach ($_COOKIE as $keyword => $value) {
if (strpos($keyword, 'phpFastCache') !== false) {
@setcookie($keyword, null, -10);
$_COOKIE[ $keyword ] = null;
}
}
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
$this->connectServer();
$x = $this->get($keyword);
return !($x == null);
}
}

@ -1,128 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\DriverInterface;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class example
* @package phpFastCache\Drivers
*/
class example extends DriverAbstract
{
/**
* phpFastCache_example constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
throw new phpFastCacheDriverException("Can't use this driver for your website!");
}
}
/**
* @return bool
*/
public function checkdriver()
{
return false;
}
/**
*
*/
public function connectServer()
{
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return void
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
// skip driver
} else {
// add driver
}
}
/**
* @param $keyword
* @param array $option
* @return null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
return null;
}
/**
* @param $keyword
* @param array $option
* @return void
*/
public function driver_delete($keyword, $option = array())
{
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
return $res;
}
/**
* @param array $option
* @return void
*/
public function driver_clean($option = array())
{
}
/**
* @param $keyword
*/
public function driver_isExisting($keyword)
{
}
}

@ -1,306 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class files
* @package phpFastCache\Drivers
*/
class files extends DriverAbstract
{
/**
* Init Cache Path
* phpFastCache_files constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct($config = array())
{
$this->setup($config);
$this->getPath(); // force create path
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
throw new phpFastCacheDriverException("Can't use this driver for your website!");
}
}
/**
* @return bool
*/
public function checkdriver()
{
if (is_writable($this->getPath())) {
return true;
}/* else {
}*/
return false;
}
/**
* @param $keyword
* @param bool $skip
* @return string
* @throws phpFastCacheDriverException
*/
private function getFilePath($keyword, $skip = false)
{
$path = $this->getPath();
$filename = $this->encodeFilename($keyword);
$folder = substr($filename, 0, 2);
$path = rtrim($path, '/') . '/' . $folder;
/**
* Skip Create Sub Folders;
*/
if ($skip == false) {
if (!file_exists($path)) {
if (!mkdir($path, $this->__setChmodAuto(), true)) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $this->getPath() . ' - 0777 OR ANY WRITABLE PERMISSION!', 92);
}
}
}
return $path . '/' . $filename . '.txt';
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
* @throws \Exception
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
$file_path = $this->getFilePath($keyword);
$data = $this->encode($value);
$toWrite = true;
/*
* Skip if Existing Caching in Options
*/
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true && file_exists($file_path)) {
$content = $this->readfile($file_path);
$old = $this->decode($content);
$toWrite = false;
if ($this->isExpired($old)) {
$toWrite = true;
}
}
// Force write
try {
if ($toWrite == true) {
$f = fopen($file_path, 'w+');
fwrite($f, $data);
fclose($f);
return true;
}
} catch (\Exception $e) {
return false;
}
return false;
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
* @throws \Exception
*/
public function driver_get($keyword, $option = array())
{
$file_path = $this->getFilePath($keyword);
if (!file_exists($file_path)) {
return null;
}
$content = $this->readfile($file_path);
$object = $this->decode($content);
if ($this->isExpired($object)) {
@unlink($file_path);
$this->autoCleanExpired();
return null;
}
return $object;
}
/**
* @param $keyword
* @param array $option
* @return bool
* @throws \Exception
*/
public function driver_delete($keyword, $option = array())
{
$file_path = $this->getFilePath($keyword, true);
if (file_exists($file_path) && @unlink($file_path)) {
return true;
} else {
return false;
}
}
/**
* Return total cache size + auto removed expired files
* @param array $option
* @return array
* @throws \Exception
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
$path = $this->getPath();
$dir = @opendir($path);
if (!$dir) {
throw new phpFastCacheDriverException("Can't read PATH:" . $path, 94);
}
$total = 0;
$removed = 0;
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..' && is_dir($path . '/' . $file)) {
// read sub dir
$subdir = opendir($path . "/" . $file);
if (!$subdir) {
throw new phpFastCacheDriverException("Can't read path:" . $path . '/' . $file, 93);
}
while ($f = readdir($subdir)) {
if ($f != '.' && $f != '..') {
$file_path = $path . '/' . $file . '/' . $f;
$size = filesize($file_path);
$object = $this->decode($this->readfile($file_path));
if (strpos($f, '.') === false) {
$key = $f;
} else {
//Because PHP 5.3, this cannot be written in single line
$key = explode('.', $f);
$key = $key[ 0 ];
}
$content[ $key ] = array(
'size' => $size,
'write_time' => (isset($object[ 'write_time' ]) ? $object[ 'write_time' ] : null),
);
if ($this->isExpired($object)) {
@unlink($file_path);
$removed += $size;
}
$total += $size;
}
}
}
}
$res[ 'size' ] = $total - $removed;
$res[ 'info' ] = array(
'Total [bytes]' => $total,
'Expired and removed [bytes]' => $removed,
'Current [bytes]' => $res[ 'size' ],
);
$res[ "data" ] = $content;
return $res;
}
/**
* @param int $time
*/
public function autoCleanExpired($time = 3600)
{
$autoclean = $this->get('keyword_clean_up_driver_files');
if ($autoclean == null) {
$this->set('keyword_clean_up_driver_files', $time);
$res = $this->stats();
}
}
/**
* @param array $option
* @throws \Exception
* @return void
*/
public function driver_clean($option = array())
{
$path = $this->getPath();
$dir = @opendir($path);
if (!$dir) {
throw new phpFastCacheDriverException("Can't read PATH:" . $path, 94);
}
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..' && is_dir($path . '/' . $file)) {
// read sub dir
$subdir = @opendir($path . '/' . $file);
if (!$subdir) {
throw new phpFastCacheDriverException("Can't read path:" . $path . '/' . $file, 93);
}
while ($f = readdir($subdir)) {
if ($f != '.' && $f != '..') {
$file_path = $path . '/' . $file . '/' . $f;
@unlink($file_path);
}
}
}
}
}
/**
* @param $keyword
* @return bool
* @throws \Exception
*/
public function driver_isExisting($keyword)
{
$file_path = $this->getFilePath($keyword, true);
if (!file_exists($file_path)) {
return false;
} else {
// check expired or not
$value = $this->get($keyword);
return !($value == null);
}
}
/**
* @param $object
* @return bool
*/
public function isExpired($object)
{
if (isset($object[ 'expired_time' ]) && time() >= $object[ 'expired_time' ]) {
return true;
} else {
return false;
}
}
}

@ -1,200 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use Memcache as MemcacheSoftware;
/**
* Class memcache
* @package phpFastCache\Drivers
*/
class memcache extends DriverAbstract
{
/**
* @var \Memcache
*/
public $instant;
/**
* @var int
*/
protected $memcacheFlags = 0;
/**
* phpFastCache_memcache constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
if (class_exists('Memcache')) {
$this->instant = new MemcacheSoftware();
if (array_key_exists('compress_data', $config) && $config[ 'compress_data' ] === true) {
$this->memcacheFlags = MEMCACHE_COMPRESSED;
}
} else {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check memcache
if (function_exists('memcache_connect')) {
return true;
}
$this->fallback = true;
return false;
}
/**
*
*/
public function connectServer()
{
$server = $this->config[ 'memcache' ];
if (count($server) < 1) {
$server = array(
array('127.0.0.1', 11211),
);
}
foreach ($server as $s) {
$name = $s[ 0 ] . "_" . $s[ 1 ];
if (!isset($this->checked[ $name ])) {
try {
if (!$this->instant->addserver($s[ 0 ], $s[ 1 ])) {
$this->fallback = true;
}
$this->checked[ $name ] = 1;
} catch (\Exception $e) {
$this->fallback = true;
}
}
}
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return array|bool
*/
public function driver_set(
$keyword,
$value = '',
$time = 300,
$option = array()
) {
$this->connectServer();
// Memcache will only allow a expiration timer less than 2592000 seconds,
// otherwise, it will assume you're giving it a UNIX timestamp.
if ($time > 2592000) {
$time = time() + $time;
}
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
return $this->instant->add($keyword, $value, $this->memcacheFlags, $time);
} else {
return $this->instant->set($keyword, $value, $this->memcacheFlags, $time);
}
}
/**
* @param $keyword
* @param array $option
* @return array|null|string
*/
public function driver_get($keyword, $option = array())
{
$this->connectServer();
// return null if no caching
// return value if in caching
$x = $this->instant->get($keyword);
if ($x == false) {
return null;
} else {
return $x;
}
}
/**
* @param $keyword
* @param array $option
*/
public function driver_delete($keyword, $option = array())
{
$this->connectServer();
$this->instant->delete($keyword);
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$this->connectServer();
$res = array(
'info' => '',
'size' => '',
'data' => $this->instant->getStats(),
);
return $res;
}
/**
* @param array $option
*/
public function driver_clean($option = array())
{
$this->connectServer();
$this->instant->flush();
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
$this->connectServer();
$x = $this->get($keyword);
return !($x == null);
}
}

@ -1,200 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use Memcached as MemcachedSoftware;
/**
* Class memcached
* @package phpFastCache\Drivers
*/
class memcached extends DriverAbstract
{
/**
* @var \Memcached
*/
public $instant;
/**
* phpFastCache_memcached constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
if (class_exists('Memcached')) {
$this->instant = new MemcachedSoftware();
} else {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
if (class_exists('Memcached')) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @return bool
*/
public function connectServer()
{
if ($this->checkdriver() == false) {
return false;
}
$s = $this->config[ 'memcache' ];
if (count($s) < 1) {
$s = array(
array('127.0.0.1', 11211, 100),
);
}
foreach ($s as $server) {
$name = isset($server[ 0 ]) ? $server[ 0 ] : '127.0.0.1';
$port = isset($server[ 1 ]) ? $server[ 1 ] : 11211;
$sharing = isset($server[ 2 ]) ? $server[ 2 ] : 0;
$checked = $name . '_' . $port;
if (!isset($this->checked[ $checked ])) {
try {
if ($sharing > 0) {
if (!$this->instant->addServer($name, $port,
$sharing)
) {
$this->fallback = true;
}
} else {
if (!$this->instant->addServer($name, $port)) {
$this->fallback = true;
}
}
$this->checked[ $checked ] = 1;
} catch (\Exception $e) {
$this->fallback = true;
}
}
}
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
$this->connectServer();
// Memcache will only allow a expiration timer less than 2592000 seconds,
// otherwise, it will assume you're giving it a UNIX timestamp.
if ($time > 2592000) {
$time = time() + $time;
}
if (isset($option[ 'isExisting' ]) && $option[ 'isExisting' ] == true) {
return $this->instant->add($keyword, $value, $time);
} else {
return $this->instant->set($keyword, $value, $time);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
$this->connectServer();
$x = @$this->instant->get($keyword);// Prevent memcached to return a warning for long keywords
if ($x == false) {
return null;
} else {
return $x;
}
}
/**
* @param $keyword
* @param array $option
* @return void
*/
public function driver_delete($keyword, $option = array())
{
$this->connectServer();
$this->instant->delete($keyword);
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$this->connectServer();
$res = array(
'info' => '',
'size' => '',
'data' => $this->instant->getStats(),
);
return $res;
}
/**
* @param array $option
* @return void
*/
public function driver_clean($option = array())
{
$this->connectServer();
$this->instant->flush();
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
$this->connectServer();
$x = $this->get($keyword);
return !($x == null);
}
}

@ -1,125 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class mongodb
* @package phpFastCache\Drivers
*/
class mongodb extends DriverAbstract
{
/**
* phpFastCache constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
throw new phpFastCacheDriverException("Can't use this driver for your website!");
}
}
/**
* @return bool
*/
public function checkdriver()
{
// return true;
return false;
}
/**
*
*/
public function connectServer()
{
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
// skip driver
} else {
// add driver
}
}
/**
* @param $keyword
* @param array $option
* @return null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
return null;
}
/**
* @param $keyword
* @param array $option
*/
public function driver_delete($keyword, $option = array())
{
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
return $res;
}
/**
* @param array $option
*/
public function driver_clean($option = array())
{
}
/**
* @param $keyword
*/
public function driver_isExisting($keyword)
{
}
}

@ -1,222 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use Predis\Client as PredisSoftware;
/**
* Class predis
* @package phpFastCache\Drivers
*/
class predis extends DriverAbstract
{
/**
* @var bool
*/
public $checked_redis = false;
/**
* phpFastCache_predis constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!class_exists("\\Predis\\Client")) {
$this->required_extension("predis-1.0/autoload");
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check memcache
if (!class_exists("\\Predis\\Client")) {
$this->required_extension("predis-1.0/autoload");
try {
\Predis\Autoloader::register();
} catch (\Exception $e) {
}
}
return true;
}
/**
* @return bool
*/
public function connectServer()
{
$server = isset($this->config[ 'redis' ]) ? $this->config[ 'redis' ] : array(
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'database' => '',
);
if ($this->checked_redis === false) {
$c = array(
'host' => $server[ 'host' ],
);
$port = isset($server[ 'port' ]) ? $server[ 'port' ] : '';
if ($port != '') {
$c[ 'port' ] = $port;
}
$password = isset($server[ 'password' ]) ? $server[ 'password' ] : '';
if ($password != '') {
$c[ 'password' ] = $password;
}
$database = isset($server[ 'database' ]) ? $server[ 'database' ] : '';
if ($database != '') {
$c[ 'database' ] = $database;
}
$timeout = isset($server[ 'timeout' ]) ? $server[ 'timeout' ] : '';
if ($timeout != '') {
$c[ 'timeout' ] = $timeout;
}
$read_write_timeout = isset($server[ 'read_write_timeout' ]) ? $server[ 'read_write_timeout' ] : '';
if ($read_write_timeout != '') {
$c[ 'read_write_timeout' ] = $read_write_timeout;
}
$this->instant = new PredisSoftware($c);
$this->checked_redis = true;
if (!$this->instant) {
$this->fallback = true;
return false;
} else {
return true;
}
}
return true;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return mixed
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
if ($this->connectServer()) {
$value = $this->encode($value);
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
return $this->instant->setex($keyword, $time, $value);
} else {
return $this->instant->setex($keyword, $time, $value);
}
} else {
return $this->backup()->set($keyword, $value, $time, $option);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
if ($this->connectServer()) {
// return null if no caching
// return value if in caching'
$x = $this->instant->get($keyword);
if ($x == false) {
return null;
} else {
return $this->decode($x);
}
} else {
$this->backup()->get($keyword, $option);
}
}
/**
* @param $keyword
* @param array $option
*/
public function driver_delete($keyword, $option = array())
{
if ($this->connectServer()) {
$this->instant->del($keyword);
}
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
if ($this->connectServer()) {
$res = array(
'info' => '',
'size' => '',
'data' => $this->instant->info(),
);
return $res;
}
return array();
}
/**
* @param array $option
* @return void
*/
public function driver_clean($option = array())
{
if ($this->connectServer()) {
$this->instant->flushDB();
}
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
if ($this->connectServer()) {
$x = $this->instant->exists($keyword);
return !($x == null);
} else {
return $this->backup()->isExisting($keyword);
}
}
}

@ -1,225 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use Redis as RedisSoftware;
/**
* Class redis
* @package phpFastCache\Drivers
*/
class redis extends DriverAbstract
{
/**
* @var bool
*/
public $checked_redis = false;
/**
* phpFastCache_predis constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
if (class_exists('Redis')) {
$this->instant = new RedisSoftware();
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check memcache
if (class_exists('Redis')) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @return bool
*/
public function connectServer()
{
$server = isset($this->config[ 'redis' ]) ? $this->config[ 'redis' ] : array(
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'database' => '',
'timeout' => '1',
);
if ($this->checked_redis === false) {
$host = $server[ 'host' ];
$port = isset($server[ 'port' ]) ? (int)$server[ 'port' ] : "";
if ($port != '') {
$c[ 'port' ] = $port;
}
$password = isset($server[ 'password' ]) ? $server[ 'password' ] : '';
if ($password != '') {
$c[ 'password' ] = $password;
}
$database = isset($server[ 'database' ]) ? $server[ 'database' ] : '';
if ($database != '') {
$c[ 'database' ] = $database;
}
$timeout = isset($server[ 'timeout' ]) ? $server[ 'timeout' ] : '';
if ($timeout != '') {
$c[ 'timeout' ] = $timeout;
}
$read_write_timeout = isset($server[ 'read_write_timeout' ]) ? $server[ 'read_write_timeout' ] : '';
if ($read_write_timeout != '') {
$c[ 'read_write_timeout' ] = $read_write_timeout;
}
if (!$this->instant->connect($host, (int)$port, (int)$timeout)) {
$this->checked_redis = true;
$this->fallback = true;
return false;
} else {
if ($database != '') {
$this->instant->select((int)$database);
}
$this->checked_redis = true;
return true;
}
}
return true;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
if ($this->connectServer()) {
$value = $this->encode($value);
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
return $this->instant->set($keyword, $value,
array('xx', 'ex' => $time));
} else {
return $this->instant->set($keyword, $value, $time);
}
} else {
return $this->backup()->set($keyword, $value, $time, $option);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
if ($this->connectServer()) {
// return null if no caching
// return value if in caching'
$x = $this->instant->get($keyword);
if ($x == false) {
return null;
} else {
return $this->decode($x);
}
} else {
$this->backup()->get($keyword, $option);
}
}
/**
* @param $keyword
* @param array $option
* @return void
*/
public function driver_delete($keyword, $option = array())
{
if ($this->connectServer()) {
$this->instant->delete($keyword);
}
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
if ($this->connectServer()) {
$res = array(
'info' => '',
'size' => '',
'data' => $this->instant->info(),
);
return $res;
}
return array();
}
/**
* @param array $option
*/
public function driver_clean($option = array())
{
if ($this->connectServer()) {
$this->instant->flushDB();
}
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
if ($this->connectServer()) {
$x = $this->instant->exists($keyword);
if ($x == null) {
return false;
} else {
return true;
}
} else {
return $this->backup()->isExisting($keyword);
}
}
}

@ -1,482 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use PDO;
use PDOException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class sqlite
* @package phpFastCache\Drivers
*/
class sqlite extends DriverAbstract
{
/**
*
*/
const SQLITE_DIR = 'sqlite';
/**
*
*/
const INDEXING_FILE = 'indexing';
/**
* @var int
*/
public $max_size = 10; // 10 mb
/**
* @var array
*/
public $instant = array();
/**
* @var null
*/
public $indexing = null;
/**
* @var string
*/
public $path = '';
/**
* @var int
*/
public $currentDB = 1;
/**
* Init Main Database & Sub Database
* phpFastCache_sqlite constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct($config = array())
{
/**
* init the path
*/
$this->setup($config);
if (!$this->checkdriver()) {
throw new phpFastCacheDriverException('SQLITE is not installed, cannot continue.');
}
if (!file_exists($this->getPath() . '/' . self::SQLITE_DIR)) {
if (!mkdir($this->getPath() . '/' . self::SQLITE_DIR, $this->__setChmodAuto(), true)) {
$this->fallback = true;
}
}
$this->path = $this->getPath() . '/' . self::SQLITE_DIR;
}
/**
* INIT NEW DB
* @param \PDO $db
*/
public function initDB(PDO $db)
{
$db->exec('drop table if exists "caching"');
$db->exec('CREATE TABLE "caching" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "keyword" VARCHAR UNIQUE, "object" BLOB, "exp" INTEGER)');
$db->exec('CREATE UNIQUE INDEX "cleanup" ON "caching" ("keyword","exp")');
$db->exec('CREATE INDEX "exp" ON "caching" ("exp")');
$db->exec('CREATE UNIQUE INDEX "keyword" ON "caching" ("keyword")');
}
/**
* INIT Indexing DB
* @param \PDO $db
*/
public function initIndexing(PDO $db)
{
// delete everything before reset indexing
$dir = opendir($this->path);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..' && $file != 'indexing' && $file != 'dbfastcache') {
unlink($this->path . '/' . $file);
}
}
$db->exec('drop table if exists "balancing"');
$db->exec('CREATE TABLE "balancing" ("keyword" VARCHAR PRIMARY KEY NOT NULL UNIQUE, "db" INTEGER)');
$db->exec('CREATE INDEX "db" ON "balancing" ("db")');
$db->exec('CREATE UNIQUE INDEX "lookup" ON "balancing" ("keyword")');
}
/**
* INIT Instant DB
* Return Database of Keyword
* @param $keyword
* @return int
*/
public function indexing($keyword)
{
if ($this->indexing == null) {
$createTable = false;
if (!file_exists($this->path . '/indexing')) {
$createTable = true;
}
$PDO = new PDO("sqlite:" . $this->path . '/' . self::INDEXING_FILE);
$PDO->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
if ($createTable == true) {
$this->initIndexing($PDO);
}
$this->indexing = $PDO;
unset($PDO);
$stm = $this->indexing->prepare("SELECT MAX(`db`) as `db` FROM `balancing`");
$stm->execute();
$row = $stm->fetch(PDO::FETCH_ASSOC);
if (!isset($row[ 'db' ])) {
$db = 1;
} elseif ($row[ 'db' ] <= 1) {
$db = 1;
} else {
$db = $row[ 'db' ];
}
// check file size
$size = file_exists($this->path . '/db' . $db) ? filesize($this->path . '/db' . $db) : 1;
$size = round($size / 1024 / 1024, 1);
if ($size > $this->max_size) {
$db = $db + 1;
}
$this->currentDB = $db;
}
// look for keyword
$stm = $this->indexing->prepare("SELECT * FROM `balancing` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute(array(
':keyword' => $keyword,
));
$row = $stm->fetch(PDO::FETCH_ASSOC);
if (isset($row[ 'db' ]) && $row[ 'db' ] != '') {
$db = $row[ 'db' ];
} else {
/*
* Insert new to Indexing
*/
$db = $this->currentDB;
$stm = $this->indexing->prepare("INSERT INTO `balancing` (`keyword`,`db`) VALUES(:keyword, :db)");
$stm->execute(array(
':keyword' => $keyword,
':db' => $db,
));
}
return $db;
}
/**
* @param $keyword
* @param bool $reset
* @return mixed
*/
public function db($keyword, $reset = false)
{
/**
* Default is fastcache
*/
$instant = $this->indexing($keyword);
/**
* init instant
*/
if (!isset($this->instant[ $instant ])) {
// check DB Files ready or not
$createTable = false;
if (!file_exists($this->path . '/db' . $instant) || $reset == true) {
$createTable = true;
}
$PDO = new PDO('sqlite:' . $this->path . '/db' . $instant);
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($createTable == true) {
$this->initDB($PDO);
}
$this->instant[ $instant ] = $PDO;
unset($PDO);
}
return $this->instant[ $instant ];
}
/**
* @return bool
*/
public function checkdriver()
{
if (extension_loaded('pdo_sqlite') && is_writable($this->getPath())) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set(
$keyword,
$value = '',
$time = 300,
$option = array()
) {
$skipExisting = isset($option[ 'skipExisting' ]) ? $option[ 'skipExisting' ] : false;
$toWrite = true;
// check in cache first
$in_cache = $this->get($keyword, $option);
if ($skipExisting == true) {
if ($in_cache == null) {
$toWrite = true;
} else {
$toWrite = false;
}
}
if ($toWrite == true) {
try {
$stm = $this->db($keyword)
->prepare("INSERT OR REPLACE INTO `caching` (`keyword`,`object`,`exp`) values(:keyword,:object,:exp)");
$stm->execute(array(
':keyword' => $keyword,
':object' => $this->encode($value),
':exp' => time() + (int)$time,
));
return true;
} catch (\PDOException $e) {
try {
$stm = $this->db($keyword, true)
->prepare("INSERT OR REPLACE INTO `caching` (`keyword`,`object`,`exp`) values(:keyword,:object,:exp)");
$stm->execute(array(
':keyword' => $keyword,
':object' => $this->encode($value),
':exp' => time() + (int)$time,
));
} catch (PDOException $e) {
return false;
}
}
}
return false;
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
try {
$stm = $this->db($keyword)
->prepare("SELECT * FROM `caching` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute(array(
':keyword' => $keyword,
));
$row = $stm->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
try {
$stm = $this->db($keyword, true)
->prepare("SELECT * FROM `caching` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute(array(
':keyword' => $keyword,
));
$row = $stm->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
return null;
}
}
if ($this->isExpired($row)) {
$this->deleteRow($row);
return null;
}
if (isset($row[ 'id' ])) {
$data = $this->decode($row[ 'object' ]);
return $data;
}
return null;
}
/**
* @param $row
* @return bool
*/
public function isExpired($row)
{
if (isset($row[ 'exp' ]) && time() >= $row[ 'exp' ]) {
return true;
}
return false;
}
/**
* @param $row
* @return bool
*/
public function deleteRow($row)
{
try {
$stm = $this->db($row[ 'keyword' ])
->prepare("DELETE FROM `caching` WHERE (`id`=:id) OR (`exp` <= :U) ");
$stm->execute(array(
':id' => $row[ 'id' ],
':U' => time(),
));
} catch (PDOException $e) {
return false;
}
}
/**
* @param $keyword
* @param array $option
* @return bool
*/
public function driver_delete($keyword, $option = array())
{
try {
$stm = $this->db($keyword)
->prepare("DELETE FROM `caching` WHERE (`keyword`=:keyword) OR (`exp` <= :U)");
$stm->execute(array(
':keyword' => $keyword,
':U' => time(),
));
} catch (PDOException $e) {
return false;
}
}
/**
* Return total cache size + auto removed expired entries
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
$total = 0;
$optimized = 0;
$dir = opendir($this->path);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..') {
$file_path = $this->path . "/" . $file;
$size = filesize($file_path);
$total = $total + $size;
try {
$PDO = new PDO("sqlite:" . $file_path);
$PDO->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$stm = $PDO->prepare("DELETE FROM `caching` WHERE `exp` <= :U");
$stm->execute(array(
':U' => date('U'),
));
$PDO->exec('VACUUM;');
$size = filesize($file_path);
$optimized = $optimized + $size;
} catch (PDOException $e) {
$size = 0;
$optimized = 0;
}
}
}
$res[ 'size' ] = $optimized;
$res[ 'info' ] = array(
'total before removing expired entries [bytes]' => $total,
'optimized after removing expired entries [bytes]' => $optimized,
);
return $res;
}
/**
* @param array $option
* @return void
*/
public function driver_clean($option = array())
{
// close connection
$this->instant = array();
$this->indexing = null;
// delete everything before reset indexing
$dir = opendir($this->path);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..') {
unlink($this->path . '/' . $file);
}
}
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
try {
$stm = $this->db($keyword)
->prepare("SELECT COUNT(`id`) as `total` FROM `caching` WHERE `keyword`=:keyword");
$stm->execute(array(
':keyword' => $keyword,
));
$data = $stm->fetch(PDO::FETCH_ASSOC);
if ($data[ 'total' ] >= 1) {
return true;
} else {
return false;
}
} catch (PDOException $e) {
return false;
}
}
}

@ -1,191 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
/**
* Class ssdb
* @package phpFastCache\Drivers
*/
class ssdb extends DriverAbstract
{
/**
* @var bool
*/
private $checked_ssdb = false;
/**
* phpFastCache_ssdb constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check memcache
$this->required_extension('SSDB');
if (class_exists('SimpleSSDB')) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @return bool
*/
public function connectServer()
{
$server = isset($this->config[ 'ssdb' ]) ? $this->config[ 'ssdb' ] : array(
'host' => "127.0.0.1",
'port' => 8888,
'password' => '',
'timeout' => 2000,
);
if ($this->checked_ssdb === false) {
$host = $server[ 'host' ];
$port = isset($server[ 'port' ]) ? (int)$server[ 'port' ] : 8888;
$password = isset($server[ 'password' ]) ? $server[ 'password' ] : '';
$timeout = !empty($server[ 'timeout' ]) ? (int)$server[ 'timeout' ] : 2000;
$this->instant = new \SimpleSSDB($host, $port, $timeout);
if (!empty($password)) {
$this->instant->auth($password);
}
$this->checked_ssdb = true;
if (!$this->instant) {
$this->fallback = true;
return false;
} else {
return true;
}
}
return true;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = '', $time = 300, $option = array())
{
if ($this->connectServer()) {
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
$x = $this->instant->get($keyword);
if ($x === false) {
return false;
} elseif (!is_null($x)) {
return true;
}
}
$value = $this->encode($value);
return $this->instant->setx($keyword, $value, $time);
} else {
return $this->backup()->set($keyword, $value, $time, $option);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
if ($this->connectServer()) {
// return null if no caching
// return value if in caching'
$x = $this->instant->get($keyword);
if ($x == false) {
return null;
} else {
return $this->decode($x);
}
} else {
$this->backup()->get($keyword, $option);
}
}
/**
* @param $keyword
* @param array $option
*/
public function driver_delete($keyword, $option = array())
{
if ($this->connectServer()) {
$this->instant->del($keyword);
}
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
if ($this->connectServer()) {
$res = array(
'info' => '',
'size' => $this->instant->dbsize(),
'data' => $this->instant->info(),
);
return $res;
}
return array();
}
/**
* @param array $option
* @return bool
*/
public function driver_clean($option = array())
{
//Is not supported, only support command line operations
return false;
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
if ($this->connectServer()) {
$x = $this->instant->exists($keyword);
return !($x == null);
} else {
return $this->backup()->isExisting($keyword);
}
}
}

@ -1,133 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
/**
* Class wincache
* @package phpFastCache\Drivers
*/
class wincache extends DriverAbstract
{
/**
* phpFastCache_wincache constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
if (extension_loaded('wincache') && function_exists('wincache_ucache_set')) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = "", $time = 300, $option = array())
{
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
return wincache_ucache_add($keyword, $value, $time);
} else {
return wincache_ucache_set($keyword, $value, $time);
}
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
$x = wincache_ucache_get($keyword, $suc);
if ($suc == false) {
return null;
} else {
return $x;
}
}
/**
* @param $keyword
* @param array $option
* @return bool
*/
public function driver_delete($keyword, $option = array())
{
return wincache_ucache_delete($keyword);
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => wincache_scache_info(),
);
return $res;
}
/**
* @param array $option
* @return bool
*/
public function driver_clean($option = array())
{
wincache_ucache_clear();
return true;
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
if (wincache_ucache_exists($keyword)) {
return true;
} else {
return false;
}
}
}

@ -1,141 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers;
use phpFastCache\Core\DriverAbstract;
use Exception;
/**
* Class xcache
* @package phpFastCache\Drivers
*/
class xcache extends DriverAbstract
{
/**
* phpFastCache_xcache constructor.
* @param array $config
*/
public function __construct($config = array())
{
$this->setup($config);
if (!$this->checkdriver() && !isset($config[ 'skipError' ])) {
$this->fallback = true;
}
}
/**
* @return bool
*/
public function checkdriver()
{
// Check xcache
if (extension_loaded('xcache') && function_exists('xcache_get')) {
return true;
}
$this->fallback = true;
return false;
}
/**
* @param $keyword
* @param string $value
* @param int $time
* @param array $option
* @return bool
*/
public function driver_set($keyword, $value = "", $time = 300, $option = array())
{
if (isset($option[ 'skipExisting' ]) && $option[ 'skipExisting' ] == true) {
if (!$this->isExisting($keyword)) {
return xcache_set($keyword, serialize($value), $time);
}
} else {
return xcache_set($keyword, serialize($value), $time);
}
return false;
}
/**
* @param $keyword
* @param array $option
* @return mixed|null
*/
public function driver_get($keyword, $option = array())
{
// return null if no caching
// return value if in caching
$data = unserialize(xcache_get($keyword));
if ($data === false || $data == '') {
return null;
}
return $data;
}
/**
* @param $keyword
* @param array $option
* @return bool
*/
public function driver_delete($keyword, $option = array())
{
return xcache_unset($keyword);
}
/**
* @param array $option
* @return array
*/
public function driver_stats($option = array())
{
$res = array(
'info' => '',
'size' => '',
'data' => '',
);
try {
$res[ 'data' ] = xcache_list(XC_TYPE_VAR, 100);
} catch (Exception $e) {
$res[ 'data' ] = array();
}
return $res;
}
/**
* @param array $option
* @return bool
*/
public function driver_clean($option = array())
{
$cnt = xcache_count(XC_TYPE_VAR);
for ($i = 0; $i < $cnt; $i++) {
xcache_clear_cache(XC_TYPE_VAR, $i);
}
return true;
}
/**
* @param $keyword
* @return bool
*/
public function driver_isExisting($keyword)
{
return xcache_isset($keyword);
}
}

@ -1,33 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\plugins;
use phpFastCache\CacheManager;
// Setup your cronjob to run this file every
// 30 mins - 60 mins to help clean up
// the expired files faster
require_once (__DIR__ . "/../phpFastCache.php");
$setup = array(
"path" => "/your_path/to_clean/"
);
$cache = CacheManager::Files($setup);
// clean up expired files cache every hour
// For now only "files" drivers is supported
$cache->autoCleanExpired(3600*1);

@ -1,43 +0,0 @@
<?php
/*
* If Any problem with Autoload on other project
* Try to put this line on your config project
* define("PHPFASTCACHE_LEGACY",true);
* and just keep include phpFastCache/phpFastCache.php or Composer Autoloader
*/
use phpFastCache\CacheManager;
require_once __DIR__.'/../Core/DriverInterface.php';
require_once __DIR__.'/../Core/DriverAbstract.php';
require_once __DIR__.'/../Core/phpFastCache.php';
require_once __DIR__.'/../Core/phpFastCacheExtensions.php';
require_once __DIR__.'/../Exceptions/phpFastCacheCoreException.php';
require_once __DIR__.'/../Exceptions/phpFastCacheDriverException.php';
require_once __DIR__.'/../Drivers/files.php';
require_once __DIR__.'/../Drivers/memcache.php';
require_once __DIR__.'/../Drivers/memcached.php';
require_once __DIR__.'/../Drivers/mongodb.php';
require_once __DIR__.'/../Drivers/predis.php';
require_once __DIR__.'/../Drivers/redis.php';
require_once __DIR__.'/../Drivers/sqlite.php';
require_once __DIR__.'/../CacheManager.php';
require_once __DIR__.'/../phpFastCache.php';
/**
* __c() Short alias
* @param string $storage
* @param array $config
* @return mixed
*/
if (!function_exists("__c")) {
function __c($storage = 'auto', $config = array())
{
return CacheManager::getInstance($storage, $config);
}
}

@ -1,33 +0,0 @@
<?php
namespace phpFastCache\Util;
define('PHP_OPEN_BASEDIR', @ini_get("open_basedir"));
class OpenBaseDir {
public static $stores = array();
public static function checkBaseDir($path) {
if(!is_null(PHP_OPEN_BASEDIR) && PHP_OPEN_BASEDIR != "") {
/*
* ONLY check ONE time if System Have Open Base Dir
* Else, always return TRUE for system without OPenBaseDir
*/
$index = md5($path);
if (!isset(self::$stores[$index])) {
// never check before, then check it 1 one time for the src dir only
$list = explode(":", PHP_OPEN_BASEDIR);
foreach ($list as $allowed_path) {
$tmp = explode($allowed_path, $path, 2);
if ($tmp[0] != $path) {
// echo "<br>".$tmp[0]." = ".$path." BY {$allowed_path}";
self::$stores[$index] = true;
return true;
}
}
self::$stores[$index] = false;
} else {
return self::$stores[$index];
}
return false;
}
return true;
}
}

@ -1,55 +0,0 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
use phpFastCache\CacheManager;
define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
if(!defined("PHPFASTCACHE_LEGACY")) {
/**
* Register Autoload
*/
spl_autoload_register(function ($entity) {
// Explode is faster than substr & strstr also more control
$module = explode('\\',$entity,2);
if ($module[0] !== 'phpFastCache') {
/**
* Not a part of phpFastCache file
* then we return here.
*/
return;
}
$entity = str_replace('\\', '/', $module[1]);
$path = __DIR__ . '/' . $entity . '.' . PHP_EXT;
if (is_readable($path)) {
require_once $path;
}
});
} else {
require_once __DIR__.'/Util/Legacy.php';
}
/**
* phpFastCache() Full alias
* @param string $storage
* @param array $config
* @return mixed
*/
if (!function_exists("phpFastCache")) {
function phpFastCache($storage = 'auto', $config = array())
{
return CacheManager::getInstance($storage, $config);
}
}

@ -0,0 +1,51 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
define('PFC_PHP_EXT', 'php');
define('PFC_BIN_DIR', __DIR__ . '/../bin/');
/**
* Register Autoload
*/
spl_autoload_register(function ($entity) {
$module = explode('\\', $entity, 2);
if (!in_array($module[ 0 ], ['phpFastCache', 'Psr'])) {
/**
* Not a part of phpFastCache file
* then we return here.
*/
return;
} else if (strpos($entity, 'Psr\Cache') === 0) {
$path = PFC_BIN_DIR . 'legacy/Psr/Cache/src/' . substr(strrchr($entity, '\\'), 1) . '.' . PFC_PHP_EXT;
if (is_readable($path)) {
require_once $path;
}else{
trigger_error('Cannot locate the Psr/Cache files', E_USER_ERROR);
}
return;
}
$entity = str_replace('\\', '/', $entity);
$path = __DIR__ . '/' . $entity . '.' . PFC_PHP_EXT;
if (is_readable($path)) {
require_once $path;
}
});
if ((!defined('PFC_IGNORE_COMPOSER_WARNING') || !PFC_IGNORE_COMPOSER_WARNING) && class_exists('Composer\Autoload\ClassLoader')) {
trigger_error('Your project already makes use of Composer. You SHOULD use the composer dependency "phpfastcache/phpfastcache" instead of hard-autoloading.',
E_USER_WARNING);
}

@ -0,0 +1,72 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache;
/**
* Class Api
* @package phpFastCache
*/
class Api
{
protected static $version = '1.1.3';
/**
* This method will returns the current
* API version, the API version will be
* updated by following the semantic versioning
* based on changes of:
* - ExtendedCacheItemPoolInterface
* - ExtendedCacheItemInterface
*
* @see http://semver.org/
* @return string
*/
public static function getVersion()
{
return self::$version;
}
/**
* Return the API changelog, as a string.
* @return string
*/
public static function getChangelog()
{
return <<<CHANGELOG
- 1.1.3
-- Added an additional CacheItemInterface method:
ExtendedCacheItemInterface::getEncodedKey()
- 1.1.2
-- Implemented [de|a]ttaching methods to improve memory management
ExtendedCacheItemPoolInterface::detachItem()
ExtendedCacheItemPoolInterface::detachAllItems()
ExtendedCacheItemPoolInterface::attachItem()
ExtendedCacheItemPoolInterface::isAttached()
- 1.1.1
-- Implemented JsonSerializable interface to ExtendedCacheItemInterface
- 1.1.0
-- Implemented JSON methods such as:
ExtendedCacheItemPoolInterface::getItemsAsJsonString()
ExtendedCacheItemPoolInterface::getItemsByTagsAsJsonString()
ExtendedCacheItemInterface::getDataAsJsonString()
- 1.0.0
-- First initial version
CHANGELOG;
}
}

@ -0,0 +1,334 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Cache;
use phpFastCache\Core\ExtendedCacheItemPoolTrait;
use phpFastCache\Exceptions\phpFastCacheDriverException;
/**
* Class DriverBaseTrait
* @package phpFastCache\Cache
*/
trait DriverBaseTrait
{
use ExtendedCacheItemPoolTrait;
/**
* @var array default options, this will be merge to Driver's Options
*/
protected $config = [];
/**
* @var bool
*/
protected $fallback = false;
/**
* @var mixed Instance of driver service
*/
protected $instance;
/**
* @param $config_name
* @param string $value
*/
public function setup($config_name, $value = '')
{
/**
* Config for class
*/
if (is_array($config_name)) {
$this->config = array_merge($this->config, $config_name);
} else {
$this->config[ $config_name ] = $value;
}
}
/**
* @return array
*/
public function getConfig()
{
return $this->config;
}
/**
* @param $file
* @return string
* @throws \Exception
*/
protected function readfile($file)
{
if (function_exists('file_get_contents')) {
return file_get_contents($file);
} else {
$string = '';
$file_handle = @fopen($file, 'r');
if (!$file_handle) {
throw new phpFastCacheDriverException("Can't Read File", 96);
}
while (!feof($file_handle)) {
$line = fgets($file_handle);
$string .= $line;
}
fclose($file_handle);
return $string;
}
}
/**
* Encode data types such as object/array
* for driver that does not support
* non-scalar value
* @param $data
* @return string
*/
protected function encode($data)
{
return serialize($data);
}
/**
* Decode data types such as object/array
* for driver that does not support
* non-scalar value
* @param $value
* @return mixed
*/
protected function decode($value)
{
return @unserialize($value);
}
/**
* Check phpModules or CGI
* @return bool
*/
protected function isPHPModule()
{
if (PHP_SAPI === 'apache2handler') {
return true;
} else {
if (strpos(PHP_SAPI, 'handler') !== false) {
return true;
}
}
return false;
}
/**
* @param $class
* @return bool
*/
protected function isExistingDriver($class)
{
return class_exists("\\phpFastCache\\Drivers\\{$class}");
}
/**
* @param $tag
* @return string
*/
protected function _getTagName($tag)
{
return "__tag__" . $tag;
}
/**
* @param \phpFastCache\Cache\ExtendedCacheItemInterface $item
* @return array
*/
public function driverPreWrap(ExtendedCacheItemInterface $item)
{
return [
self::DRIVER_DATA_WRAPPER_INDEX => $item->get(),
self::DRIVER_TIME_WRAPPER_INDEX => $item->getExpirationDate(),
self::DRIVER_TAGS_WRAPPER_INDEX => $item->getTags(),
];
}
/**
* @param array $wrapper
* @return mixed
*/
public function driverUnwrapData(array $wrapper)
{
return $wrapper[ self::DRIVER_DATA_WRAPPER_INDEX ];
}
/**
* @param array $wrapper
* @return mixed
*/
public function driverUnwrapTags(array $wrapper)
{
return $wrapper[ self::DRIVER_TAGS_WRAPPER_INDEX ];
}
/**
* @param array $wrapper
* @return \DateTime
*/
public function driverUnwrapTime(array $wrapper)
{
return $wrapper[ self::DRIVER_TIME_WRAPPER_INDEX ];
}
/**
* @return string
*/
public function getDriverName()
{
static $driverName;
return ($driverName ?: $driverName = ucfirst(substr(strrchr((new \ReflectionObject($this))->getNamespaceName(), '\\'), 1)));
}
/**
* @param \phpFastCache\Cache\ExtendedCacheItemInterface $item
* @return bool
* @throws \LogicException
*/
public function driverWriteTags(ExtendedCacheItemInterface $item)
{
/**
* Do not attempt to write tags
* on tags item, it can leads
* to an infinite recursive calls
*/
if(strpos($item->getKey(), self::DRIVER_TAGS_KEY_PREFIX ) === 0){
throw new \LogicException('Trying to set tag(s) to an Tag item index: ' . $item->getKey());
}
/**
* @var $tagsItems ExtendedCacheItemInterface[]
*/
$tagsItems = $this->getItems($this->getTagKeys($item->getTags()));
foreach ($tagsItems as $tagsItem) {
$data = $tagsItem->get();
$expTimestamp = $item->getExpirationDate()->getTimestamp();
/**
* Using the key will
* avoid to use array_unique
* that has slow performances
*/
$tagsItem->set(array_merge((array) $data, [$item->getKey() => $expTimestamp]));
/**
* Set the expiration date
* of the $tagsItem based
* on the older $item
* expiration date
*/
if ($expTimestamp > $tagsItem->getExpirationDate()->getTimestamp()) {
$tagsItem->expiresAt($item->getExpirationDate());
}
$this->driverWrite($tagsItem);
$tagsItem->setHit(true);
}
/**
* Also update removed tags to
* keep the index up to date
*/
$tagsItems = $this->getItems($this->getTagKeys($item->getRemovedTags()));
foreach ($tagsItems as $tagsItem) {
$data = (array) $tagsItem->get();
unset($data[ $item->getKey() ]);
$tagsItem->set($data);
/**
* Recalculate the expiration date
*
* If the $tagsItem does not have
* any cache item references left
* then remove it from tagsItems index
*/
if (count($data)) {
$tagsItem->expiresAt(max($data));
$this->driverWrite($tagsItem);
$tagsItem->setHit(true);
} else {
$this->deleteItem($tagsItem->getKey());
}
}
return true;
}
/**
* @param $key
* @return string
*/
public function getTagKey($key)
{
return self::DRIVER_TAGS_KEY_PREFIX . $key;
}
/**
* @param $key
* @return string
*/
public function getTagKeys(array $keys)
{
foreach ($keys as &$key) {
$key = $this->getTagKey($key);
}
return $keys;
}
/**
* @param string $optionName
* @param mixed $optionValue
* @return bool
* @throws \InvalidArgumentException
*/
public static function isValidOption($optionName, $optionValue)
{
if (!is_string($optionName)) {
throw new \InvalidArgumentException('$optionName must be a string');
}
return true;
}
/**
* @return array
*/
public static function getRequiredOptions()
{
return [];
}
/**
* @return array
*/
public static function getValidOptions()
{
return [];
}
}

@ -0,0 +1,170 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Cache;
use Psr\Cache\CacheItemInterface;
/**
* Interface ExtendedCacheItemInterface
* @package phpFastCache\Cache
*/
interface ExtendedCacheItemInterface extends CacheItemInterface, \JsonSerializable
{
/**
* Returns the encoded key for the current cache item.
* Usually as a MD5 hash
*
* @return string
* The encoded key string for this cache item.
*/
public function getEncodedKey();
/**
* @return mixed
*/
public function getUncommittedData();
/**
* @return \DateTimeInterface
*/
public function getExpirationDate();
/**
* @return int
*/
public function getTtl();
/**
* @return bool
*/
public function isExpired();
/**
* @param \phpFastCache\Cache\ExtendedCacheItemPoolInterface $driver
* @return mixed
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver);
/**
* @param bool $isHit
* @return $this
* @throws \InvalidArgumentException
*/
public function setHit($isHit);
/**
* @param int $step
* @return $this
* @throws \InvalidArgumentException
*/
public function increment($step = 1);
/**
* @param int $step
* @return $this
* @throws \InvalidArgumentException
*/
public function decrement($step = 1);
/**
* @param array|string $data
* @return $this
* @throws \InvalidArgumentException
*/
public function append($data);
/**
* @param array|string $data
* @return $this
* @throws \InvalidArgumentException
*/
public function prepend($data);
/**
* Sets the expiration time for this cache item.
*
* @param int|\DateInterval $time
* The period of time from the present after which the item MUST be considered
* expired. An integer parameter is understood to be the time in seconds until
* expiration. If null is passed explicitly, a default value MAY be used.
* If none is set, the value should be stored permanently or for as long as the
* implementation allows.
*
* @return static
* The called object.
*
* @deprecated Use CacheItemInterface::expiresAfter() instead
*/
public function touch($time);
/**
* @param string $tagName
* @return $this
* @throws \InvalidArgumentException
*/
public function addTag($tagName);
/**
* @param array $tagNames
* @return $this
*/
public function addTags(array $tagNames);
/**
* @param array $tags
* @return $this
* @throws \InvalidArgumentException
*/
public function setTags(array $tags);
/**
* @return array
*/
public function getTags();
/**
* @param string $separator
* @return mixed
*/
public function getTagsAsString($separator = ', ');
/**
* @param array $tagName
* @return $this
*/
public function removeTag($tagName);
/**
* @param array $tagNames
* @return $this
*/
public function removeTags(array $tagNames);
/**
* @return array
*/
public function getRemovedTags();
/**
* Return the data as a well-formatted string.
* Any scalar value will be casted to an array
* @param int $option json_encode() options
* @param int $depth json_encode() depth
* @return string
*/
public function getDataAsJsonString($option = 0, $depth = 512);
}

@ -0,0 +1,357 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Cache;
use InvalidArgumentException;
use phpFastCache\Entities\driverStatistic;
use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
/**
* Interface ExtendedCacheItemPoolInterface
* @package phpFastCache\Cache
*/
interface ExtendedCacheItemPoolInterface extends CacheItemPoolInterface
{
/**
* @return array
*/
public function getConfig();
/**
* @return string
*/
public function getDriverName();
/**
* [phpFastCache phpDoc Override]
* Returns a Cache Item representing the specified key.
*
* This method must always return a CacheItemInterface object, even in case of
* a cache miss. It MUST NOT return null.
*
* @param string $key
* The key for which to return the corresponding Cache Item.
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return ExtendedCacheItemInterface
* The corresponding Cache Item.
*/
public function getItem($key);
/**
* [phpFastCache phpDoc Override]
* Returns a traversable set of cache items.
*
* @param array $keys
* An indexed array of keys of items to retrieve.
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return ExtendedCacheItemInterface[]
* A traversable collection of Cache Items keyed by the cache keys of
* each item. A Cache item will be returned for each key, even if that
* key is not found. However, if no keys are specified then an empty
* traversable MUST be returned instead.
*/
public function getItems(array $keys = []);
/**
* Returns A json string that represents an array of items.
*
* @param array $keys
* An indexed array of keys of items to retrieve.
* @param int $option json_encode() options
* @param int $depth json_encode() depth
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return string
*/
public function getItemsAsJsonString(array $keys = [], $option = 0, $depth = 512);
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
public function setItem(CacheItemInterface $item);
/**
* Deletes all items in the pool.
* @deprecated Use clear() instead
* Will be removed in 5.1
*
* @return bool
* True if the pool was successfully cleared. False if there was an error.
*/
public function clean();
/**
* @return driverStatistic
*/
public function getStats();
/**
* Returns a traversable set of cache items by a tag name.
*
* @param string $tagName
* An indexed array of keys of items to retrieve.
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return ExtendedCacheItemInterface[]
* A traversable collection of Cache Items keyed by the cache keys of
* each item. A Cache item will be returned for each key, even if that
* key is not found. However, if no keys are specified then an empty
* traversable MUST be returned instead.
*/
public function getItemsByTag($tagName);
/**
* Returns a traversable set of cache items by a tag name.
*
* @param array $tagNames
* An indexed array of keys of items to retrieve.
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return ExtendedCacheItemInterface[]
* A traversable collection of Cache Items keyed by the cache keys of
* each item. A Cache item will be returned for each key, even if that
* key is not found. However, if no keys are specified then an empty
* traversable MUST be returned instead.
*/
public function getItemsByTags(array $tagNames);
/**
* Returns A json string that represents an array of items by tags-based.
*
* @param array $tagNames
* An indexed array of keys of items to retrieve.
* @param int $option json_encode() options
* @param int $depth json_encode() depth
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return string
*/
public function getItemsByTagsAsJsonString(array $tagNames, $option = 0, $depth = 512);
/**
* Removes the item from the pool by tag.
*
* @param string $tagName
* The tag for which to delete
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully removed. False if there was an error.
*/
public function deleteItemsByTag($tagName);
/**
* Removes the item from the pool by tag.
*
* @param array $tagNames
* The tag for which to delete
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully removed. False if there was an error.
*/
public function deleteItemsByTags(array $tagNames);
/**
* Increment the items from the pool by tag.
*
* @param string $tagName
* The tag for which to increment
* @param int $step
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully incremented. False if there was an error.
*/
public function incrementItemsByTag($tagName, $step = 1);
/**
* Increment the items from the pool by tag.
*
* @param array $tagNames
* The tag for which to increment
* @param int $step
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully incremented. False if there was an error.
*/
public function incrementItemsByTags(array $tagNames, $step = 1);
/**
* Decrement the items from the pool by tag.
*
* @param string $tagName
* The tag for which to decrement
* @param int $step
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully decremented. False if there was an error.
*/
public function decrementItemsByTag($tagName, $step = 1);
/**
* Decrement the items from the pool by tag.
*
* @param array $tagNames
* The tag for which to decrement
* @param int $step
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully decremented. False if there was an error.
*/
public function decrementItemsByTags(array $tagNames, $step = 1);
/**
* Decrement the items from the pool by tag.
*
* @param string $tagName
* The tag for which to append
*
* @param array|string $data
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully appended. False if there was an error.
*/
public function appendItemsByTag($tagName, $data);
/**
* Decrement the items from the pool by tag.
*
* @param array $tagNames
* The tag for which to append
*
* @param array|string $data
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully appended. False if there was an error.
*/
public function appendItemsByTags(array $tagNames, $data);
/**
* Prepend the items from the pool by tag.
*
* @param string $tagName
* The tag for which to prepend
*
* @param array|string $data
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully prepended. False if there was an error.
*/
public function prependItemsByTag($tagName, $data);
/**
* Prepend the items from the pool by tag.
*
* @param array $tagNames
* The tag for which to prepend
*
* @param array|string $data
*
* @throws InvalidArgumentException
* If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return bool
* True if the item was successfully prepended. False if there was an error.
*/
public function prependItemsByTags(array $tagNames, $data);
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return void
*/
public function detachItem(CacheItemInterface $item);
/**
* @return void
*/
public function detachAllItems();
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return void
* @throws \LogicException
*/
public function attachItem(CacheItemInterface $item);
/**
* Returns true if the item exists, is attached and the Spl Hash matches
* Returns false if the item exists, is attached and the Spl Hash mismatches
* Returns null if the item does not exists
*
* @param \Psr\Cache\CacheItemInterface $item
* @return bool|null
* @throws \LogicException
*/
public function isAttached(CacheItemInterface $item);
}

@ -0,0 +1,447 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Cache;
use phpFastCache\Core\DriverAbstract;
trait ItemBaseTrait
{
/**
* @var bool
*/
protected $fetched = false;
/**
* @var DriverAbstract
*/
protected $driver;
/**
* @var string
*/
protected $key;
/**
* @var mixed
*/
protected $data;
/**
* @var \DateTime
*/
protected $expirationDate;
/**
* @var array
*/
protected $tags = [];
/**
* @var array
*/
protected $removedTags = [];
/**
* @var bool
*/
protected $isHit = false;
/********************
*
* PSR-6 Methods
*
*******************/
/**
* @return string
*/
public function getKey()
{
return $this->key;
}
/**
* @return mixed
*/
public function get()
{
return $this->data;
}
/**
* @param mixed $value
* @return $this
*/
public function set($value)
{
/**
* The user set a value,
* therefore there is no need to
* fetch from source anymore
*/
$this->fetched = true;
$this->data = $value;
return $this;
}
/**
* @return bool
* @throws \InvalidArgumentException
*/
public function isHit()
{
return $this->isHit;
}
/**
* @param bool $isHit
* @return $this
* @throws \InvalidArgumentException
*/
public function setHit($isHit)
{
if (is_bool($isHit)) {
$this->isHit = $isHit;
return $this;
} else {
throw new \InvalidArgumentException('$isHit must be a boolean');
}
}
/**
* @param \DateTimeInterface $expiration
* @return $this
*/
public function expiresAt($expiration)
{
if ($expiration instanceof \DateTimeInterface) {
$this->expirationDate = $expiration;
} else {
throw new \InvalidArgumentException('$expiration must be an object implementing the DateTimeInterface');
}
return $this;
}
/**
* Sets the expiration time for this cache item.
*
* @param int|\DateInterval $time
* The period of time from the present after which the item MUST be considered
* expired. An integer parameter is understood to be the time in seconds until
* expiration. If null is passed explicitly, a default value MAY be used.
* If none is set, the value should be stored permanently or for as long as the
* implementation allows.
*
* @return static
* The called object.
*
* @deprecated Use CacheItemInterface::expiresAfter() instead
*/
public function touch($time)
{
trigger_error('touch() is deprecated and will be removed in the next major release, use CacheItemInterface::expiresAfter() instead');
return $this->expiresAfter($time);
}
/**
* @param \DateInterval|int $time
* @return $this
* @throws \InvalidArgumentException
*/
public function expiresAfter($time)
{
if (is_numeric($time)) {
if ($time <= 0) {
/**
* 5 years, however memcached or memory cached will gone when u restart it
* just recommended for sqlite. files
*/
$time = 30 * 24 * 3600 * 5;
}
$this->expirationDate = (new \DateTime())->add(new \DateInterval(sprintf('PT%dS', $time)));
} else if ($time instanceof \DateInterval) {
$this->expirationDate = (new \DateTime())->add($time);
} else {
throw new \InvalidArgumentException('Invalid date format');
}
return $this;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return string
*/
public function getEncodedKey()
{
return md5($this->getKey());
}
/**
* @return mixed
*/
public function getUncommittedData()
{
return $this->data;
}
/**
* @return \DateTimeInterface
*/
public function getExpirationDate()
{
return $this->expirationDate;
}
/**
* @return int
*/
public function getTtl()
{
$ttl = $this->expirationDate->getTimestamp() - time();
if ($ttl > 2592000) {
$ttl = time() + $ttl;
}
return $ttl;
}
/**
* @return bool
*/
public function isExpired()
{
return $this->expirationDate->getTimestamp() < (new \DateTime())->getTimestamp();
}
/**
* @param int $step
* @return $this
* @throws \InvalidArgumentException
*/
public function increment($step = 1)
{
if (is_int($step)) {
$this->fetched = true;
$this->data += $step;
} else {
throw new \InvalidArgumentException('$step must be numeric.');
}
return $this;
}
/**
* @param int $step
* @return $this
* @throws \InvalidArgumentException
*/
public function decrement($step = 1)
{
if (is_int($step)) {
$this->fetched = true;
$this->data -= $step;
} else {
throw new \InvalidArgumentException('$step must be numeric.');
}
return $this;
}
/**
* @param array|string $data
* @return $this
* @throws \InvalidArgumentException
*/
public function append($data)
{
if (is_array($this->data)) {
array_push($this->data, $data);
} else if (is_string($data)) {
$this->data .= (string) $data;
} else {
throw new \InvalidArgumentException('$data must be either array nor string.');
}
return $this;
}
/**
* @param array|string $data
* @return $this
* @throws \InvalidArgumentException
*/
public function prepend($data)
{
if (is_array($this->data)) {
array_unshift($this->data, $data);
} else if (is_string($data)) {
$this->data = (string) $data . $this->data;
} else {
throw new \InvalidArgumentException('$data must be either array nor string.');
}
return $this;
}
/**
* @param $tagName
* @return $this
* @throws \InvalidArgumentException
*/
public function addTag($tagName)
{
if (is_string($tagName)) {
$this->tags = array_unique(array_merge($this->tags, [$tagName]));
return $this;
} else {
throw new \InvalidArgumentException('$tagName must be a string');
}
}
/**
* @param array $tagNames
* @return $this
*/
public function addTags(array $tagNames)
{
foreach ($tagNames as $tagName) {
$this->addTag($tagName);
}
return $this;
}
/**
* @param array $tags
* @return $this
* @throws \InvalidArgumentException
*/
public function setTags(array $tags)
{
if (count($tags)) {
if (array_filter($tags, 'is_string')) {
$this->tags = $tags;
} else {
throw new \InvalidArgumentException('$tagName must be an array of string');
}
}
return $this;
}
/**
* @return array
*/
public function getTags()
{
return $this->tags;
}
/**
* @return string
*/
public function getTagsAsString($separator = ', ')
{
return implode($separator, $this->tags);
}
/**
* @param $tagName
* @return $this
*/
public function removeTag($tagName)
{
if (($key = array_search($tagName, $this->tags)) !== false) {
unset($this->tags[ $key ]);
$this->removedTags[] = $tagName;
}
return $this;
}
/**
* @param array $tagNames
* @return $this
*/
public function removeTags(array $tagNames)
{
foreach ($tagNames as $tagName) {
$this->removeTag($tagName);
}
return $this;
}
/**
* @return array
*/
public function getRemovedTags()
{
return array_diff($this->removedTags, $this->tags);
}
/**
* Return the data as a well-formatted string.
* Any scalar value will be casted to an array
* @param int $option json_encode() options
* @param int $depth json_encode() depth
* @return string
*/
public function getDataAsJsonString($option = 0, $depth = 512)
{
$data = $this->get();
if (is_object($data) || is_array($data)) {
$data = json_encode($data, $option, $depth);
} else {
$data = json_encode([$data], $option, $depth);
}
return json_encode($data, $option, $depth);
}
/**
* Implements \JsonSerializable interface
* @return mixed
*/
public function jsonSerialize()
{
return $this->get();
}
/**
* Prevent recursions for Debug (php 5.6+)
* @return array
*/
final public function __debugInfo()
{
$info = get_object_vars($this);
$info[ 'driver' ] = 'object(' . get_class($info[ 'driver' ]) . ')';
return (array) $info;
}
}

@ -0,0 +1,270 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
/**
* Class CacheManager
* @package phpFastCache
*
* @method static ExtendedCacheItemPoolInterface Apc() Apc($config = []) Return a driver "apc" instance
* @method static ExtendedCacheItemPoolInterface Apcu() Apcu($config = []) Return a driver "apcu" instance
* @method static ExtendedCacheItemPoolInterface Cookie() Cookie($config = []) Return a driver "cookie" instance
* @method static ExtendedCacheItemPoolInterface Couchbase() Couchbase($config = []) Return a driver "couchbase" instance
* @method static ExtendedCacheItemPoolInterface Files() Files($config = []) Return a driver "files" instance
* @method static ExtendedCacheItemPoolInterface Leveldb() Leveldb($config = []) Return a driver "leveldb" instance
* @method static ExtendedCacheItemPoolInterface Memcache() Memcache($config = []) Return a driver "memcache" instance
* @method static ExtendedCacheItemPoolInterface Memcached() Memcached($config = []) Return a driver "memcached" instance
* @method static ExtendedCacheItemPoolInterface Mongodb() Mongodb($config = []) Return a driver "mongodb" instance
* @method static ExtendedCacheItemPoolInterface Predis() Predis($config = []) Return a driver "predis" instance
* @method static ExtendedCacheItemPoolInterface Redis() Redis($config = []) Return a driver "redis" instance
* @method static ExtendedCacheItemPoolInterface Sqlite() Sqlite($config = []) Return a driver "sqlite" instance
* @method static ExtendedCacheItemPoolInterface Ssdb() Ssdb($config = []) Return a driver "ssdb" instance
* @method static ExtendedCacheItemPoolInterface Wincache() Wincache($config = []) Return a driver "wincache" instance
* @method static ExtendedCacheItemPoolInterface Xcache() Xcache($config = []) Return a driver "xcache" instance
* @method static ExtendedCacheItemPoolInterface Zenddisk() Zenddisk($config = []) Return a driver "zend disk cache" instance
* @method static ExtendedCacheItemPoolInterface Zendshm() Zendshm($config = []) Return a driver "zend memory cache" instance
*
*/
class CacheManager
{
/**
* @var int
*/
public static $ReadHits = 0;
/**
* @var int
*/
public static $WriteHits = 0;
/**
* @var array
*/
protected static $config = [
'securityKey' => 'auto', // The securityKey that will be used to create the sub-directory
'ignoreSymfonyNotice' => false, // Ignore Symfony notices for Symfony projects that do not makes use of PhpFastCache's Symfony Bundle
'defaultTtl' => 900, // Default time-to-live in seconds
'htaccess' => true, // Auto-generate .htaccess if it is missing
'default_chmod' => 0777, // 0777 is recommended
'path' => '', // If not set will be the value of sys_get_temp_dir()
'fallback' => false, // Fall back when old driver is not supported
'limited_memory_each_object' => 4096, // Maximum size (bytes) of object store in memory
'compress_data' => false, // Compress stored data if the backend supports it
];
/**
* @var string
*/
protected static $namespacePath;
/**
* @var array
*/
protected static $instances = [];
/**
* @param string $driver
* @param array $config
* @return ExtendedCacheItemPoolInterface
*/
public static function getInstance($driver = 'auto', $config = [])
{
static $badPracticeOmeter = [];
/**
* @todo: Standardize a method for driver name
*/
$driver = self::standardizeDriverName($driver);
$config = array_merge(self::$config, $config);
if (!$driver || $driver === 'Auto') {
$driver = self::getAutoClass($config);
}
$instance = crc32($driver . serialize($config));
if (!isset(self::$instances[ $instance ])) {
$badPracticeOmeter[$driver] = 1;
if(!$config['ignoreSymfonyNotice'] && interface_exists('Symfony\Component\HttpKernel\KernelInterface') && !class_exists('phpFastCache\Bundle\phpFastCacheBundle')){
trigger_error('A Symfony Bundle to make the PhpFastCache integration more easier is now available here: https://github.com/PHPSocialNetwork/phpfastcache-bundle', E_USER_NOTICE);
}
$class = self::getNamespacePath() . $driver . '\Driver';
try{
self::$instances[ $instance ] = new $class($config);
}catch(phpFastCacheDriverCheckException $e){
$fallback = self::standardizeDriverName($config['fallback']);
if($fallback && $fallback !== $driver){
$class = self::getNamespacePath() . $fallback . '\Driver';
self::$instances[ $instance ] = new $class($config);
trigger_error(sprintf('The "%s" driver is unavailable at the moment, the fallback driver "%s" has been used instead.', $driver, $fallback), E_USER_WARNING);
}else{
throw new phpFastCacheDriverCheckException($e->getMessage(), $e->getCode(), $e);
}
}
} else if(++$badPracticeOmeter[$driver] >= 5){
trigger_error('[' . $driver . '] Calling many times CacheManager::getInstance() for already instanced drivers is a bad practice and have a significant impact on performances.
See https://github.com/PHPSocialNetwork/phpfastcache/wiki/[V5]-Why-calling-getInstance%28%29-each-time-is-a-bad-practice-%3F');
}
return self::$instances[ $instance ];
}
/**
* @param $config
* @return string
* @throws phpFastCacheDriverCheckException
*/
public static function getAutoClass($config = [])
{
static $autoDriver;
if ($autoDriver === null) {
foreach (self::getStaticSystemDrivers() as $driver) {
try {
self::getInstance($driver, $config);
$autoDriver = $driver;
} catch (phpFastCacheDriverCheckException $e) {
continue;
}
}
}
return $autoDriver;
}
/**
* @param string $name
* @param array $arguments
* @return \Psr\Cache\CacheItemPoolInterface
*/
public static function __callStatic($name, $arguments)
{
$options = (array_key_exists(0, $arguments) && is_array($arguments) ? $arguments[ 0 ] : []);
return self::getInstance($name, $options);
}
/**
* @return bool
*/
public static function clearInstances()
{
self::$instances = [];
gc_collect_cycles();
return !count(self::$instances);
}
/**
* @return string
*/
public static function getNamespacePath()
{
return self::$namespacePath ?: __NAMESPACE__ . '\Drivers\\';
}
/**
* @param string $path
*/
public static function setNamespacePath($path)
{
self::$namespacePath = $path;
}
/**
* @param $name
* @param string $value
* @deprecated Method "setup" is deprecated and will be removed in V6. Use method "setDefaultConfig" instead.
* @throws \InvalidArgumentException
*/
public static function setup($name, $value = '')
{
trigger_error('Method "setup" is deprecated and will be removed in V6 Use method "setDefaultConfig" instead.', E_USER_DEPRECATED);
self::setDefaultConfig($name, $value);
}
/**
* @param $name string|array
* @param mixed $value
* @throws \InvalidArgumentException
*/
public static function setDefaultConfig($name, $value = null)
{
if (is_array($name)) {
self::$config = array_merge(self::$config, $name);
} else if (is_string($name)){
self::$config[ $name ] = $value;
}else{
throw new \InvalidArgumentException('Invalid variable type: $name');
}
}
/**
* @return array
*/
public static function getDefaultConfig()
{
return self::$config;
}
/**
* @return array
*/
public static function getStaticSystemDrivers()
{
return [
'Sqlite',
'Files',
'Apc',
'Apcu',
'Memcache',
'Memcached',
'Couchbase',
'Mongodb',
'Predis',
'Redis',
'Ssdb',
'Leveldb',
'Wincache',
'Xcache',
'Zenddisk',
'Zendshm',
'Devnull',
];
}
/**
* @return array
*/
public static function getStaticAllDrivers()
{
return array_merge(self::getStaticSystemDrivers(), [
'Devtrue',
'Devfalse',
'Cookie',
]);
}
/**
* @param string $driverName
* @return string
*/
public static function standardizeDriverName($driverName)
{
return ucfirst(strtolower(trim($driverName)));
}
}

@ -15,17 +15,22 @@
namespace phpFastCache\Core; namespace phpFastCache\Core;
/** /**
* Class phpFastCacheExtensions * Trait ClassNamespaceResolverTrait
* @package phpFastCache\Core * @package phpFastCache\Core
*/ */
abstract class phpFastCacheExtensions trait ClassNamespaceResolverTrait
{ {
/** /**
* @param $name * @return string
* @param $agr
*/ */
public function __call($name, $agr) protected function getClassNamespace()
{ {
static $namespace;
if (!$namespace) {
$namespace = (new \ReflectionObject($this))->getNamespaceName();
}
return $namespace;
} }
} }

@ -0,0 +1,67 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use phpFastCache\Cache\DriverBaseTrait;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use Psr\Cache\CacheItemInterface;
/**
* Class DriverAbstract
* @package phpFastCache\Core
*/
abstract class DriverAbstract implements ExtendedCacheItemPoolInterface
{
use DriverBaseTrait;
const DRIVER_CHECK_FAILURE = '%s is not installed or is misconfigured, cannot continue.';
const DRIVER_TAGS_KEY_PREFIX = '_TAG_';
const DRIVER_DATA_WRAPPER_INDEX = 'd';
const DRIVER_TIME_WRAPPER_INDEX = 't';
const DRIVER_TAGS_WRAPPER_INDEX = 'g';
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return array [
* 'd' => 'THE ITEM DATA'
* 't' => 'THE ITEM DATE EXPIRATION'
* 'g' => 'THE ITEM TAGS'
* ]
*
*/
abstract protected function driverRead(CacheItemInterface $item);
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
abstract protected function driverWrite(CacheItemInterface $item);
/**
* @return bool
*/
abstract protected function driverClear();
/**
* @return bool
*/
abstract protected function driverConnect();
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
*/
abstract protected function driverDelete(CacheItemInterface $item);
}

@ -0,0 +1,370 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use InvalidArgumentException;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use Psr\Cache\CacheItemInterface;
trait ExtendedCacheItemPoolTrait
{
use StandardPsr6StructureTrait;
/**
* Deletes all items in the pool.
* @deprecated Use clear() instead
* Will be removed in 5.1
*
* @return bool
* True if the pool was successfully cleared. False if there was an error.
*/
public function clean()
{
trigger_error('Cache clean() method is deprecated, use clear() method instead', E_USER_DEPRECATED);
return $this->clear();
}
/**
* @param array $keys
* An indexed array of keys of items to retrieve.
* @param int $option json_encode() options
* @param int $depth json_encode() depth
* @return string
* @throws \InvalidArgumentException
*/
public function getItemsAsJsonString(array $keys = [], $option = 0, $depth = 512)
{
$callback = function(CacheItemInterface $item){
return $item->get();
};
return json_encode(array_map($callback, array_values($this->getItems($keys))), $option, $depth);
}
/**
* @param string $tagName
* @return \phpFastCache\Cache\ExtendedCacheItemInterface[]
* @throws InvalidArgumentException
*/
public function getItemsByTag($tagName)
{
if (is_string($tagName)) {
$driverResponse = $this->getItem($this->getTagKey($tagName));
if ($driverResponse->isHit()) {
$items = (array) $driverResponse->get();
/**
* getItems() may provides expired item(s)
* themselves provided by a cache of item
* keys based stored the tag item.
* Therefore we pass a filter callback
* to remove the expired Item(s) provided by
* the item keys passed through getItems()
*
* #headache
*/
return array_filter($this->getItems(array_unique(array_keys($items))), function(ExtendedCacheItemInterface $item){
return $item->isHit();
});
} else {
return [];
}
} else {
throw new InvalidArgumentException('$tagName must be a string');
}
}
/**
* @param array $tagNames
* @return \phpFastCache\Cache\ExtendedCacheItemInterface[]
* @throws InvalidArgumentException
*/
public function getItemsByTags(array $tagNames)
{
$items = [];
foreach (array_unique($tagNames) as $tagName) {
$items = array_merge($items, $this->getItemsByTag($tagName));
}
return $items;
}
/**
* Returns A json string that represents an array of items by tags-based.
*
* @param array $tagNames
* An indexed array of keys of items to retrieve.
* @param int $option json_encode() options
* @param int $depth json_encode() depth
*
* @throws InvalidArgumentException
* If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException
* MUST be thrown.
*
* @return string
*/
public function getItemsByTagsAsJsonString(array $tagNames, $option = 0, $depth = 512)
{
$callback = function(CacheItemInterface $item){
return $item->get();
};
return json_encode(array_map($callback, array_values($this->getItemsByTags($tagNames))), $option, $depth);
}
/**
* @param string $tagName
* @return bool|null
* @throws InvalidArgumentException
*/
public function deleteItemsByTag($tagName)
{
if (is_string($tagName)) {
$return = null;
foreach ($this->getItemsByTag($tagName) as $item) {
$result = $this->deleteItem($item->getKey());
if ($return !== false) {
$return = $result;
}
}
return $return;
} else {
throw new InvalidArgumentException('$tagName must be a string');
}
}
/**
* @param array $tagNames
* @return bool|null
* @throws InvalidArgumentException
*/
public function deleteItemsByTags(array $tagNames)
{
$return = null;
foreach ($tagNames as $tagName) {
$result = $this->deleteItemsByTag($tagName);
if ($return !== false) {
$return = $result;
}
}
return $return;
}
/**
* @inheritdoc
*/
public function incrementItemsByTag($tagName, $step = 1)
{
if (is_string($tagName) && is_int($step)) {
foreach ($this->getItemsByTag($tagName) as $item) {
$item->increment($step);
$this->saveDeferred($item);
}
return $this->commit();
} else {
throw new InvalidArgumentException('$tagName must be a string and $step an integer');
}
}
/**
* @inheritdoc
*/
public function incrementItemsByTags(array $tagNames, $step = 1)
{
$return = null;
foreach ($tagNames as $tagName) {
$result = $this->incrementItemsByTag($tagName, $step);
if ($return !== false) {
$return = $result;
}
}
return $return;
}
/**
* @inheritdoc
*/
public function decrementItemsByTag($tagName, $step = 1)
{
if (is_string($tagName) && is_int($step)) {
foreach ($this->getItemsByTag($tagName) as $item) {
$item->decrement($step);
$this->saveDeferred($item);
}
return $this->commit();
} else {
throw new InvalidArgumentException('$tagName must be a string and $step an integer');
}
}
/**
* @inheritdoc
*/
public function decrementItemsByTags(array $tagNames, $step = 1)
{
$return = null;
foreach ($tagNames as $tagName) {
$result = $this->decrementItemsByTag($tagName, $step);
if ($return !== false) {
$return = $result;
}
}
return $return;
}
/**
* @inheritdoc
*/
public function appendItemsByTag($tagName, $data)
{
if (is_string($tagName)) {
foreach ($this->getItemsByTag($tagName) as $item) {
$item->append($data);
$this->saveDeferred($item);
}
return $this->commit();
} else {
throw new InvalidArgumentException('$tagName must be a string');
}
}
/**
* @inheritdoc
*/
public function appendItemsByTags(array $tagNames, $data)
{
$return = null;
foreach ($tagNames as $tagName) {
$result = $this->appendItemsByTag($tagName, $data);
if ($return !== false) {
$return = $result;
}
}
return $return;
}
/**
* @inheritdoc
*/
public function prependItemsByTag($tagName, $data)
{
if (is_string($tagName)) {
foreach ($this->getItemsByTag($tagName) as $item) {
$item->prepend($data);
$this->saveDeferred($item);
}
return $this->commit();
} else {
throw new InvalidArgumentException('$tagName must be a string');
}
}
/**
* @inheritdoc
*/
public function prependItemsByTags(array $tagNames, $data)
{
$return = null;
foreach ($tagNames as $tagName) {
$result = $this->prependItemsByTag($tagName, $data);
if ($return !== false) {
$return = $result;
}
}
return $return;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return void
*/
public function detachItem(CacheItemInterface $item)
{
if(isset($this->itemInstances[$item->getKey()])){
$this->deregisterItem($item);
}
}
/**
* @return void
*/
public function detachAllItems()
{
foreach ($this->itemInstances as $item) {
$this->detachItem($item);
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return void
* @throws \LogicException
*/
public function attachItem(CacheItemInterface $item)
{
if(isset($this->itemInstances[$item->getKey()]) && spl_object_hash($item) !== spl_object_hash($this->itemInstances[ $item->getKey() ])){
throw new \LogicException('The item already exists and cannot be overwritten because the Spl object hash mismatches ! You probably tried to re-attach a detached item which has been already retrieved from cache.');
}else{
$this->itemInstances[$item->getKey()] = $item;
}
}
/**
* @internal This method de-register an item from $this->itemInstances
* @param CacheItemInterface|string $item
* @throws \InvalidArgumentException
*/
protected function deregisterItem($item)
{
if($item instanceof CacheItemInterface){
unset($this->itemInstances[ $item->getKey() ]);
}else if(is_string($item)){
unset($this->itemInstances[ $item ]);
}else{
throw new \InvalidArgumentException('Invalid type for $item variable');
}
if(gc_enabled()){
gc_collect_cycles();
}
}
/**
* Returns true if the item exists, is attached and the Spl Hash matches
* Returns false if the item exists, is attached and the Spl Hash mismatches
* Returns null if the item does not exists
*
* @param \Psr\Cache\CacheItemInterface $item
* @return bool|null
* @throws \LogicException
*/
public function isAttached(CacheItemInterface $item)
{
if(isset($this->itemInstances[$item->getKey()])){
return spl_object_hash($item) === spl_object_hash($this->itemInstances[ $item->getKey() ]);
}
return null;
}
}

@ -0,0 +1,40 @@
<?php
namespace phpFastCache\Core;
/**
* Trait MemcacheDriverCollisionDetectorTrait
* @package phpFastCache\Core
*/
trait MemcacheDriverCollisionDetectorTrait
{
/**
* @var string
*/
protected static $driverUsed;
/**
* @param $driverName
* @return bool
*/
public static function checkCollision($driverName)
{
$CONSTANT_NAME = __NAMESPACE__ . '\MEMCACHE_DRIVER_USED';
if ($driverName && is_string($driverName)) {
if (!defined($CONSTANT_NAME)) {
define($CONSTANT_NAME, $driverName);
return true;
} else if (constant($CONSTANT_NAME) !== $driverName) {
trigger_error('Memcache collision detected, you used both Memcache and Memcached driver in your script, this may leads to unexpected behaviours',
E_USER_WARNING);
return false;
}
return true;
}
return false;
}
}

@ -0,0 +1,242 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use phpFastCache\Exceptions\phpFastCacheCoreException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpFastCache\Util\Directory;
/**
* Trait PathSeekerTrait
* @package phpFastCache\Core\Pool\IO
* @property array $config The configuration array passed via DriverBaseTrait
*/
trait PathSeekerTrait
{
/**
* @var array
*/
public $tmp = [];
/**
* @param bool $readonly
* @return string
* @throws phpFastCacheDriverException
*/
public function getPath($readonly = false)
{
/**
* Get the base system temporary directory
*/
$tmp_dir = rtrim(ini_get('upload_tmp_dir') ?: sys_get_temp_dir(), '\\/') . DIRECTORY_SEPARATOR . 'phpfastcache';
/**
* Calculate the security key
*/
{
$securityKey = array_key_exists('securityKey', $this->config) ? $this->config[ 'securityKey' ] : '';
if (!$securityKey || $securityKey === 'auto') {
if (isset($_SERVER[ 'HTTP_HOST' ])) {
$securityKey = preg_replace('/^www./', '', strtolower(str_replace(':', '_', $_SERVER[ 'HTTP_HOST' ])));
} else {
$securityKey = ($this->isPHPModule() ? 'web' : 'cli');
}
}
if ($securityKey !== '') {
$securityKey .= '/';
}
$securityKey = static::cleanFileName($securityKey);
}
/**
* Extends the temporary directory
* with the security key and the driver name
*/
$tmp_dir = rtrim($tmp_dir, '/') . DIRECTORY_SEPARATOR;
if (empty($this->config[ 'path' ]) || !is_string($this->config[ 'path' ])) {
$path = $tmp_dir;
} else {
$path = rtrim($this->config[ 'path' ], '/') . DIRECTORY_SEPARATOR;
}
$path_suffix = $securityKey . DIRECTORY_SEPARATOR . $this->getDriverName();
$full_path = Directory::getAbsolutePath($path . $path_suffix);
$full_path_tmp = Directory::getAbsolutePath($tmp_dir . $path_suffix);
$full_path_hash = md5($full_path);
/**
* In readonly mode we only attempt
* to verify if the directory exists
* or not, if it does not then we
* return the temp dir
*/
if ($readonly === true) {
if(!@file_exists($full_path) || !@is_writable($full_path)){
return $full_path_tmp;
}
return $full_path;
}else{
if (!isset($this->tmp[ $full_path_hash ]) || (!@file_exists($full_path) || !@is_writable($full_path))) {
if (!@file_exists($full_path)) {
@mkdir($full_path, $this->setChmodAuto(), true);
}elseif (!@is_writable($full_path)) {
if (!@chmod($full_path, $this->setChmodAuto()))
{
/**
* Switch back to tmp dir
* again if the path is not writable
*/
$full_path = $full_path_tmp;
if (!@file_exists($full_path)) {
@mkdir($full_path, $this->setChmodAuto(), true);
}
}
}
/**
* In case there is no directory
* writable including tye temporary
* one, we must throw an exception
*/
if (!@file_exists($full_path) || !@is_writable($full_path)) {
throw new phpFastCacheDriverException('PLEASE CREATE OR CHMOD ' . $full_path . ' - 0777 OR ANY WRITABLE PERMISSION!');
}
$this->tmp[ $full_path_hash ] = $full_path;
$this->htaccessGen($full_path, array_key_exists('htaccess', $this->config) ? $this->config[ 'htaccess' ] : false);
}
}
return realpath($full_path);
}
/**
* @param $keyword
* @return string
*/
protected function encodeFilename($keyword)
{
return md5($keyword);
}
/**
* @return bool
*/
public function isExpired()
{
trigger_error(__FUNCTION__ . '() is deprecated, use ExtendedCacheItemInterface::isExpired() instead.', E_USER_DEPRECATED);
return true;
}
/**
* @return string
* @throws \phpFastCache\Exceptions\phpFastCacheCoreException
*/
public function getFileDir()
{
return $this->getPath() . DIRECTORY_SEPARATOR . self::FILE_DIR;
}
/**
* @param $keyword
* @param bool $skip
* @return string
* @throws phpFastCacheDriverException
*/
private function getFilePath($keyword, $skip = false)
{
$path = $this->getFileDir();
if ($keyword === false) {
return $path;
}
$filename = $this->encodeFilename($keyword);
$folder = substr($filename, 0, 2);
$path = rtrim($path, '/') . '/' . $folder;
/**
* Skip Create Sub Folders;
*/
if ($skip == false) {
if (!file_exists($path)) {
if (@!mkdir($path, $this->setChmodAuto(), true)) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $this->getPath() . ' - ' . $this->setChmodAuto() . ' OR ANY WRITABLE PERMISSION!');
}
}
}
return $path . '/' . $filename . '.txt';
}
/**
* @param $this ->config
* @return int
*/
public function setChmodAuto()
{
if (!isset($this->config[ 'default_chmod' ]) || $this->config[ 'default_chmod' ] == '' || is_null($this->config[ 'default_chmod' ])) {
return 0777;
} else {
return $this->config[ 'default_chmod' ];
}
}
/**
* @param $filename
* @return mixed
*/
protected static function cleanFileName($filename)
{
$regex = [
'/[\?\[\]\/\\\=\<\>\:\;\,\'\"\&\$\#\*\(\)\|\~\`\!\{\}]/',
'/\.$/',
'/^\./',
];
$replace = ['-', '', ''];
return trim(preg_replace($regex, $replace, trim($filename)), '-');
}
/**
* @param $path
* @param bool $create
* @throws \Exception
*/
protected function htaccessGen($path, $create = true)
{
if ($create === true) {
if (!is_writable($path)) {
try {
if(!chmod($path, 0777)){
throw new phpFastCacheDriverException('Chmod failed on : ' . $path);
}
} catch (phpFastCacheDriverException $e) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $path . ' - 0777 OR ANY WRITABLE PERMISSION!', 0, $e);
}
}
if (!file_exists($path . "/.htaccess")) {
$html = "order deny, allow \r\n
deny from all \r\n
allow from 127.0.0.1";
$file = @fopen($path . '/.htaccess', 'w+');
if (!$file) {
throw new phpFastCacheDriverException('PLEASE CHMOD ' . $path . ' - 0777 OR ANY WRITABLE PERMISSION!');
}
fwrite($file, $html);
fclose($file);
}
}
}
}

@ -0,0 +1,247 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Core;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\CacheManager;
use phpFastCache\Exceptions\phpFastCacheCoreException;
use Psr\Cache\CacheItemInterface;
/**
* Trait StandardPsr6StructureTrait
* @package phpFastCache\Core
*/
trait StandardPsr6StructureTrait
{
use ClassNamespaceResolverTrait;
/**
* @var array
*/
protected $deferredList = [];
/**
* @var ExtendedCacheItemInterface[]
*/
protected $itemInstances = [];
/**
* @param string $key
* @return \phpFastCache\Cache\ExtendedCacheItemInterface
* @throws \InvalidArgumentException
* @throws phpFastCacheCoreException
*/
public function getItem($key)
{
if (is_string($key)) {
if (!array_key_exists($key, $this->itemInstances)) {
/**
* @var $item ExtendedCacheItemInterface
*/
CacheManager::$ReadHits++;
$class = new \ReflectionClass((new \ReflectionObject($this))->getNamespaceName() . '\Item');
$item = $class->newInstanceArgs([$this, $key]);
$driverArray = $this->driverRead($item);
if ($driverArray) {
if(!is_array($driverArray)){
throw new phpFastCacheCoreException(sprintf('The driverRead method returned an unexpected variable type: %s', gettype($driverArray)));
}
$item->set($this->driverUnwrapData($driverArray));
$item->expiresAt($this->driverUnwrapTime($driverArray));
$item->setTags($this->driverUnwrapTags($driverArray));
if ($item->isExpired()) {
/**
* Using driverDelete() instead of delete()
* to avoid infinite loop caused by
* getItem() call in delete() method
* As we MUST return an item in any
* way, we do not de-register here
*/
$this->driverDelete($item);
} else {
$item->setHit(true);
}
} else {
$item->expiresAfter(abs((int) $this->getConfig()[ 'defaultTtl' ]));
}
}
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
return $this->itemInstances[ $key ];
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return $this
* @throws \InvalidArgumentException
*/
public function setItem(CacheItemInterface $item)
{
if ($this->getClassNamespace() . '\\Item' === get_class($item)) {
$this->itemInstances[ $item->getKey() ] = $item;
return $this;
} else {
throw new \InvalidArgumentException(sprintf('Invalid Item Class "%s" for this driver.', get_class($item)));
}
}
/**
* @param array $keys
* @return CacheItemInterface[]
* @throws \InvalidArgumentException
*/
public function getItems(array $keys = [])
{
$collection = [];
foreach ($keys as $key) {
$collection[ $key ] = $this->getItem($key);
}
return $collection;
}
/**
* @param string $key
* @return bool
* @throws \InvalidArgumentException
*/
public function hasItem($key)
{
CacheManager::$ReadHits++;
return $this->getItem($key)->isHit();
}
/**
* @return bool
*/
public function clear()
{
CacheManager::$WriteHits++;
$this->itemInstances = [];
return $this->driverClear();
}
/**
* @param string $key
* @return bool
* @throws \InvalidArgumentException
*/
public function deleteItem($key)
{
$item = $this->getItem($key);
if ($this->hasItem($key) && $this->driverDelete($item)) {
$item->setHit(false);
CacheManager::$WriteHits++;
/**
* De-register the item instance
* then collect gc cycles
*/
$this->deregisterItem($key);
return true;
}
return false;
}
/**
* @param array $keys
* @return bool
* @throws \InvalidArgumentException
*/
public function deleteItems(array $keys)
{
$return = null;
foreach ($keys as $key) {
$result = $this->deleteItem($key);
if ($result !== false) {
$return = $result;
}
}
return (bool) $return;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
* @throws \RuntimeException
*/
public function save(CacheItemInterface $item)
{
/**
* @var ExtendedCacheItemInterface $item
*/
if (!array_key_exists($item->getKey(), $this->itemInstances)) {
$this->itemInstances[ $item->getKey() ] = $item;
} else if(spl_object_hash($item) !== spl_object_hash($this->itemInstances[ $item->getKey() ])){
throw new \RuntimeException('Spl object hash mismatches ! You probably tried to save a detached item which has been already retrieved from cache.');
}
if ($this->driverWrite($item) && $this->driverWriteTags($item)) {
$item->setHit(true);
CacheManager::$WriteHits++;
return true;
}
return false;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return \Psr\Cache\CacheItemInterface
* @throws \RuntimeException
*/
public function saveDeferred(CacheItemInterface $item)
{
if (!array_key_exists($item->getKey(), $this->itemInstances)) {
$this->itemInstances[ $item->getKey() ] = $item;
}else if(spl_object_hash($item) !== spl_object_hash($this->itemInstances[ $item->getKey() ])){
throw new \RuntimeException('Spl object hash mismatches ! You probably tried to save a detached item which has been already retrieved from cache.');
}
return $this->deferredList[ $item->getKey() ] = $item;
}
/**
* @return mixed|null
* @throws \InvalidArgumentException
*/
public function commit()
{
$return = null;
foreach ($this->deferredList as $key => $item) {
$result = $this->save($item);
if ($return !== false) {
unset($this->deferredList[ $key ]);
$return = $result;
}
}
return (bool) $return;
}
}

@ -0,0 +1,143 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Apc;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (extension_loaded('apc') && ini_get('apc.enabled')) {
return true;
} else {
return false;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return apc_store($item->getKey(), $this->driverPreWrap($item), ($ttl > 0 ? $ttl : 0));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$data = apc_fetch($item->getKey(), $success);
if ($success === false) {
return null;
}
return $data;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return apc_delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return @apc_clear_cache() && @apc_clear_cache('user');
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stats = (array) apc_cache_info('user');
$date = (new \DateTime())->setTimestamp($stats[ 'start_time' ]);
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("The APC cache is up since %s, and have %d item(s) in cache.\n For more information see RawData.", $date->format(DATE_RFC2822),
$stats[ 'num_entries' ]))
->setRawData($stats)
->setSize($stats[ 'mem_size' ]);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Apc;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Apc\Driver as ApcDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Apc\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(ApcDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof ApcDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,142 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Apcu;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (extension_loaded('apcu') && ini_get('apc.enabled')) {
return true;
} else {
return false;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return apcu_store($item->getKey(), $this->driverPreWrap($item), ($ttl > 0 ? $ttl : 0));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$data = apcu_fetch($item->getKey(), $success);
if ($success === false) {
return null;
}
return $data;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return apcu_delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return @apcu_clear_cache() && @apcu_clear_cache('user');
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stats = (array) apcu_cache_info('user');
$date = (new \DateTime())->setTimestamp($stats[ 'start_time' ]);
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("The APCU cache is up since %s, and have %d item(s) in cache.\n For more information see RawData.", $date->format(DATE_RFC2822), $stats[ 'num_entries' ]))
->setRawData($stats)
->setSize($stats[ 'mem_size' ]);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Apcu;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Apcu\Driver as ApcuDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apcu
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Apcu\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(ApcuDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof ApcuDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,197 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Cookie;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
const PREFIX = 'PFC_';
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (function_exists('setcookie')) {
return true;
} else {
return false;
}
}
/**
* @return bool
*/
protected function driverConnect()
{
return !(!array_key_exists('phpFastCache', $_COOKIE) && !@setcookie('phpFastCache', 1, 10));
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$this->driverConnect();
$keyword = self::PREFIX . $item->getKey();
$v = json_encode($this->driverPreWrap($item));
if (isset($this->config[ 'limited_memory_each_object' ]) && strlen($v) > $this->config[ 'limited_memory_each_object' ]) {
return false;
}
return setcookie($keyword, $v, $item->getExpirationDate()->getTimestamp(), '/');
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \phpFastCache\Exceptions\phpFastCacheDriverException
*/
protected function driverRead(CacheItemInterface $item)
{
$this->driverConnect();
// return null if no caching
// return value if in caching
$keyword = self::PREFIX . $item->getKey();
$x = isset($_COOKIE[ $keyword ]) ? json_decode($_COOKIE[ $keyword ], true) : false;
if ($x == false) {
return null;
} else {
if (!is_scalar($this->driverUnwrapData($x)) && !is_null($this->driverUnwrapData($x))) {
throw new phpFastCacheDriverException('Hacking attempt: The decoding returned a non-scalar value, Cookie driver does not allow this.');
}
return $x;
}
}
/**
* @param $key
* @return int
*/
protected function driverReadExpirationDate($key)
{
$this->driverConnect();
$keyword = self::PREFIX . $key;
$x = isset($_COOKIE[ $keyword ]) ? $this->decode(json_decode($_COOKIE[ $keyword ])->t) : false;
return $x ? $x - time() : $x;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$this->driverConnect();
$keyword = self::PREFIX . $item->getKey();
$_COOKIE[ $keyword ] = null;
return @setcookie($keyword, null, -10);
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
$return = null;
$this->driverConnect();
foreach ($_COOKIE as $keyword => $value) {
if (strpos($keyword, self::PREFIX) !== false) {
$_COOKIE[ $keyword ] = null;
$result = @setcookie($keyword, null, -10);
if ($return !== false) {
$return = $result;
}
}
}
return $return;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$size = 0;
$stat = new driverStatistic();
$stat->setData($_COOKIE);
/**
* Only count PFC Cookie
*/
foreach ($_COOKIE as $key => $value) {
if (strpos($key, self::PREFIX) === 0) {
$size += strlen($value);
}
}
$stat->setSize($size);
return $stat;
}
}

@ -0,0 +1,65 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Cookie;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Cookie\Driver as CookieDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Cookie\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(CookieDriver $driver, $key)
{
if (is_string($key)) {
$this->expirationDate = new \DateTime();
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.',
gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof CookieDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,199 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Couchbase;
use CouchbaseCluster as CouchbaseClient;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* @var CouchbaseClient
*/
public $instance;
/**
* @var \CouchbaseBucket[]
*/
protected $bucketInstances = [];
/**
* @var string
*/
protected $bucketCurrent = '';
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->driverConnect();
}
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('Couchbase');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->getBucket()->upsert($item->getKey(), $this->encode($this->driverPreWrap($item)), ['expiry' => $item->getTtl()]);
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
try {
/**
* CouchbaseBucket::get() returns a CouchbaseMetaDoc object
*/
return $this->decode($this->getBucket()->get($item->getKey())->value);
} catch (\CouchbaseException $e) {
return null;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->getBucket()->remove($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->getBucket()->manager()->flush();
}
/**
* @return bool
*/
protected function driverConnect()
{
if ($this->instance instanceof CouchbaseClient) {
throw new \LogicException('Already connected to Couchbase server');
} else {
$host = isset($this->config[ 'host' ]) ? $this->config[ 'host' ] : '127.0.0.1';
//$port = isset($server[ 'port' ]) ? $server[ 'port' ] : '11211';
$password = isset($this->config[ 'password' ]) ? $this->config[ 'password' ] : '';
$username = isset($this->config[ 'username' ]) ? $this->config[ 'username' ] : '';
$buckets = isset($this->config[ 'buckets' ]) ? $this->config[ 'buckets' ] : [
[
'bucket' => 'default',
'password' => '',
],
];
$this->instance = $this->instance ?: new CouchbaseClient("couchbase://{$host}", $username, $password);
foreach ($buckets as $bucket) {
$this->bucketCurrent = $this->bucketCurrent ?: $bucket[ 'bucket' ];
$this->setBucket($bucket[ 'bucket' ], $this->instance->openBucket($bucket[ 'bucket' ], $bucket[ 'password' ]));
}
}
}
/**
* @return \CouchbaseBucket
*/
protected function getBucket()
{
return $this->bucketInstances[ $this->bucketCurrent ];
}
/**
* @param $bucketName
* @param \CouchbaseBucket $CouchbaseBucket
* @throws \LogicException
*/
protected function setBucket($bucketName, \CouchbaseBucket $CouchbaseBucket)
{
if (!array_key_exists($bucketName, $this->bucketInstances)) {
$this->bucketInstances[ $bucketName ] = $CouchbaseBucket;
} else {
throw new \LogicException('A bucket instance with this name already exists.');
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$info = $this->getBucket()->manager()->info();
return (new driverStatistic())
->setSize($info[ 'basicStats' ][ 'diskUsed' ])
->setRawData($info)
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo('CouchBase version ' . $info[ 'nodes' ][ 0 ][ 'version' ] . ', Uptime (in days): ' . round($info[ 'nodes' ][ 0 ][ 'uptime' ] / 86400, 1) . "\n For more information see RawData.");
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Couchbase;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Couchbase\Driver as CouchbaseDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Couchbase\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(CouchbaseDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof CouchbaseDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,136 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devfalse;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return true;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return true;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return array [
* 'd' => 'THE ITEM DATA'
* 't' => 'THE ITEM DATE EXPIRATION'
* 'g' => 'THE ITEM TAGS'
* ]
*/
protected function driverRead(CacheItemInterface $item)
{
return [
self::DRIVER_DATA_WRAPPER_INDEX => false,
self::DRIVER_TAGS_WRAPPER_INDEX => [],
self::DRIVER_TIME_WRAPPER_INDEX => new \DateTime(),
];
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return true;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return true;
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stat = new driverStatistic();
$stat->setInfo('[Devfalse] A void info string')
->setSize(0)
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData(false);
return $stat;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devfalse;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Devnull\Driver as DevnullDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Devnull
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Devnull\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(DevnullDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof DevnullDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,138 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devnull;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return true;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return true;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return array [
* 'd' => 'THE ITEM DATA'
* 't' => 'THE ITEM DATE EXPIRATION'
* 'g' => 'THE ITEM TAGS'
* ]
*/
protected function driverRead(CacheItemInterface $item)
{
return [
self::DRIVER_DATA_WRAPPER_INDEX => null,
self::DRIVER_TAGS_WRAPPER_INDEX => [],
self::DRIVER_TIME_WRAPPER_INDEX => new \DateTime(),
];
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return true;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return true;
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stat = new driverStatistic();
$stat->setInfo('[Devnull] A void info string')
->setSize(0)
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData(null);
return $stat;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devnull;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Devnull\Driver as DevnullDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Devnull
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Devnull\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(DevnullDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof DevnullDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,138 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devtrue;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return true;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return false;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return array [
* 'd' => 'THE ITEM DATA'
* 't' => 'THE ITEM DATE EXPIRATION'
* 'g' => 'THE ITEM TAGS'
* ]
*/
protected function driverRead(CacheItemInterface $item)
{
return [
self::DRIVER_DATA_WRAPPER_INDEX => true,
self::DRIVER_TAGS_WRAPPER_INDEX => [],
self::DRIVER_TIME_WRAPPER_INDEX => new \DateTime(),
];
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return false;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return false;
}
/**
* @return bool
*/
protected function driverConnect()
{
return false;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stat = new driverStatistic();
$stat->setInfo('[Devtrue] A void info string')
->setSize(0)
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData(true);
return $stat;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Devtrue;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Devtrue\Driver as DevtrueDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Devtrue
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Devtrue\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(DevtrueDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof DevtrueDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,239 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Files;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\PathSeekerTrait;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpFastCache\Util\Directory;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
use PathSeekerTrait;
/**
*
*/
const FILE_DIR = 'files';
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return is_writable($this->getFileDir()) || @mkdir($this->getFileDir(), $this->setChmodAuto(), true);
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$file_path = $this->getFilePath($item->getKey());
$data = $this->encode($this->driverPreWrap($item));
$toWrite = true;
/**
* Skip if Existing Caching in Options
*/
if (isset($this->config[ 'skipExisting' ]) && $this->config[ 'skipExisting' ] == true && file_exists($file_path)) {
$content = $this->readfile($file_path);
$old = $this->decode($content);
$toWrite = false;
if ($old->isExpired()) {
$toWrite = true;
}
}
/**
* Force write
*/
try {
if ($toWrite == true) {
$f = fopen($file_path, 'w+');
fwrite($f, $data);
fclose($f);
return true;
}
} catch (\Exception $e) {
return false;
}
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
$file_path = $this->getFilePath($item->getKey());
if (!file_exists($file_path)) {
return null;
}
$content = $this->readfile($file_path);
return $this->decode($content);
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$file_path = $this->getFilePath($item->getKey(), true);
if (file_exists($file_path) && @unlink($file_path)) {
return true;
} else {
return false;
}
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return (bool) Directory::rrmdir($this->getPath(true));
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/**
* @param string $optionName
* @param mixed $optionValue
* @return bool
* @throws \InvalidArgumentException
*/
public static function isValidOption($optionName, $optionValue)
{
parent::isValidOption($optionName, $optionValue);
switch ($optionName) {
case 'path':
return is_string($optionValue);
break;
case 'default_chmod':
return is_numeric($optionValue);
break;
case 'securityKey':
return is_string($optionValue);
break;
case 'htaccess':
return is_bool($optionValue);
break;
default:
return false;
break;
}
}
/**
* @return array
*/
public static function getValidOptions()
{
return ['path', 'default_chmod', 'securityKey', 'htaccess'];
}
/**
* @return array
*/
public static function getRequiredOptions()
{
return ['path'];
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
* @throws \phpFastCache\Exceptions\phpFastCacheCoreException
* @throws \phpFastCache\Exceptions\phpFastCacheDriverException
*/
public function getStats()
{
$stat = new driverStatistic();
$path = $this->getFilePath(false);
if (!is_dir($path)) {
throw new phpFastCacheDriverException("Can't read PATH:" . $path, 94);
}
$stat->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData([])
->setSize(Directory::dirSize($path))
->setInfo('Number of files used to build the cache: ' . Directory::getFileCount($path));
return $stat;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Files;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Files\Driver as FilesDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Files\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(FilesDriver $driver, $key)
{
if (is_string($key)) {
$this->expirationDate = new \DateTime();
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', get_class($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof FilesDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,177 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Leveldb;
use LevelDB as LeveldbClient;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\PathSeekerTrait;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpFastCache\Util\Directory;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
use PathSeekerTrait;
const LEVELDB_FILENAME = '.database';
/**
* @var LeveldbClient Instance of driver service
*/
public $instance;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->driverConnect();
}
}
/**
* @return string
* @throws \phpFastCache\Exceptions\phpFastCacheCoreException
*/
public function getLeveldbFile()
{
return $this->getPath() . '/' . self::LEVELDB_FILENAME;
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('Leveldb');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->set($item->getKey(), $this->encode($this->driverPreWrap($item)));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getKey());
if ($val == false) {
return null;
} else {
return $this->decode($val);
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
if ($this->instance instanceof LeveldbClient) {
$this->instance->close();
$this->instance = null;
}
$result = LeveldbClient::destroy($this->getLeveldbFile());
$this->driverConnect();
return $result;
}
/**
* @return bool
*/
protected function driverConnect()
{
if ($this->instance instanceof LeveldbClient) {
throw new \LogicException('Already connected to Leveldb database');
} else {
$this->instance = $this->instance ?: new LeveldbClient($this->getLeveldbFile());
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo('Number of files used to build the cache: ' . Directory::getFileCount($this->getLeveldbFile()))
->setSize(Directory::dirSize($this->getLeveldbFile()));
}
/**
* Close connection on destruct
*/
public function __destruct()
{
if ($this->instance instanceof LeveldbClient) {
$this->instance->close();
$this->instance = null;
}
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Leveldb;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Leveldb\Driver as LeveldbDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Leveldb
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Leveldb\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(LeveldbDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof LeveldbDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,176 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Memcache;
use Memcache as MemcacheSoftware;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\MemcacheDriverCollisionDetectorTrait;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
use MemcacheDriverCollisionDetectorTrait;
/**
* @var int
*/
protected $memcacheFlags = 0;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
self::checkCollision('Memcache');
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->instance = new MemcacheSoftware();
$this->driverConnect();
if (array_key_exists('compress_data', $config) && $config[ 'compress_data' ] === true) {
$this->memcacheFlags = MEMCACHE_COMPRESSED;
}
}
}
/**
* @return bool
*/
public function driverCheck()
{
return class_exists('Memcache');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->set($item->getKey(), $this->driverPreWrap($item), $this->memcacheFlags, $item->getTtl());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getKey());
if ($val === false) {
return null;
} else {
return $val;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->instance->flush();
}
/**
* @return bool
*/
protected function driverConnect()
{
$servers = (!empty($this->config[ 'memcache' ]) && is_array($this->config[ 'memcache' ]) ? $this->config[ 'memcache' ] : []);
if (count($servers) < 1) {
$servers = [
['127.0.0.1', 11211],
];
}
foreach ($servers as $server) {
try {
if (!$this->instance->addserver($server[ 0 ], $server[ 1 ])) {
$this->fallback = true;
}
if(!empty($server[ 'sasl_user' ]) && !empty($server[ 'sasl_password'])){
$this->instance->setSaslAuthData($server[ 'sasl_user' ], $server[ 'sasl_password']);
}
} catch (\Exception $e) {
$this->fallback = true;
}
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stats = (array) $this->instance->getstats();
$stats[ 'uptime' ] = (isset($stats[ 'uptime' ]) ? $stats[ 'uptime' ] : 0);
$stats[ 'version' ] = (isset($stats[ 'version' ]) ? $stats[ 'version' ] : 'UnknownVersion');
$stats[ 'bytes' ] = (isset($stats[ 'bytes' ]) ? $stats[ 'version' ] : 0);
$date = (new \DateTime())->setTimestamp(time() - $stats[ 'uptime' ]);
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("The memcache daemon v%s is up since %s.\n For more information see RawData.", $stats[ 'version' ], $date->format(DATE_RFC2822)))
->setRawData($stats)
->setSize($stats[ 'bytes' ]);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Memcache;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Memcache\Driver as MemcacheDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Memcache\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(MemcacheDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof MemcacheDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,175 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Memcached;
use Memcached as MemcachedSoftware;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\MemcacheDriverCollisionDetectorTrait;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
use MemcacheDriverCollisionDetectorTrait;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
self::checkCollision('Memcached');
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->instance = new MemcachedSoftware();
$this->driverConnect();
}
}
/**
* @return bool
*/
public function driverCheck()
{
return class_exists('Memcached');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
// Memcache will only allow a expiration timer less than 2592000 seconds,
// otherwise, it will assume you're giving it a UNIX timestamp.
if ($ttl > 2592000) {
$ttl = time() + $ttl;
}
return $this->instance->set($item->getKey(), $this->driverPreWrap($item), $ttl);
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getKey());
if ($val === false) {
return null;
} else {
return $val;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->instance->flush();
}
/**
* @return bool
*/
protected function driverConnect()
{
$servers = (!empty($this->config[ 'memcache' ]) && is_array($this->config[ 'memcache' ]) ? $this->config[ 'memcache' ] : []);
if (count($servers) < 1) {
$servers = [
['127.0.0.1', 11211],
];
}
foreach ($servers as $server) {
try {
if (!$this->instance->addServer($server[ 0 ], $server[ 1 ])) {
$this->fallback = true;
}
if(!empty($server[ 'sasl_user' ]) && !empty($server[ 'sasl_password'])){
$this->instance->setSaslAuthData($server[ 'sasl_user' ], $server[ 'sasl_password']);
}
} catch (\Exception $e) {
$this->fallback = true;
}
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stats = (array) $this->instance->getStats();
$stats[ 'uptime' ] = (isset($stats[ 'uptime' ]) ? $stats[ 'uptime' ] : 0);
$stats[ 'version' ] = (isset($stats[ 'version' ]) ? $stats[ 'version' ] : 'UnknownVersion');
$stats[ 'bytes' ] = (isset($stats[ 'bytes' ]) ? $stats[ 'version' ] : 0);
$date = (new \DateTime())->setTimestamp(time() - $stats[ 'uptime' ]);
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("The memcache daemon v%s is up since %s.\n For more information see RawData.", $stats[ 'version' ], $date->format(DATE_RFC2822)))
->setRawData($stats)
->setSize($stats[ 'bytes' ]);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Memcached;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Memcached\Driver as MemcachedDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Memcache\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(MemcachedDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof MemcachedDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,223 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Mongodb;
use LogicException;
use MongoBinData;
use MongoClient as MongodbClient;
use MongoCollection;
use MongoConnectionException;
use MongoCursorException;
use MongoDate;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* @var MongodbClient
*/
public $instance;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->driverConnect();
}
}
/**
* @return bool
*/
public function driverCheck()
{
if(class_exists('MongoDB\Driver\Manager')){
trigger_error('PhpFastCache currently only support the pecl Mongo extension.<br />
The Support for the MongoDB extension will be added coming soon.', E_USER_ERROR);
}
return extension_loaded('Mongodb') && class_exists('MongoClient');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
try {
$result = (array) $this->getCollection()->update(
['_id' => $item->getKey()],
[
'$set' => [
self::DRIVER_TIME_WRAPPER_INDEX => ($item->getTtl() > 0 ? new MongoDate(time() + $item->getTtl()) : new MongoDate(time())),
self::DRIVER_DATA_WRAPPER_INDEX => new MongoBinData($this->encode($item->get()), MongoBinData::BYTE_ARRAY),
self::DRIVER_TAGS_WRAPPER_INDEX => new MongoBinData($this->encode($item->getTags()), MongoBinData::BYTE_ARRAY),
],
],
['upsert' => true, 'multiple' => false]
);
} catch (MongoCursorException $e) {
return false;
}
return isset($result[ 'ok' ]) ? $result[ 'ok' ] == 1 : true;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$document = $this->getCollection()
->findOne(['_id' => $item->getKey()],
[self::DRIVER_DATA_WRAPPER_INDEX, self::DRIVER_TIME_WRAPPER_INDEX, self::DRIVER_TAGS_WRAPPER_INDEX /*'d', 'e'*/]);
if ($document) {
return [
self::DRIVER_DATA_WRAPPER_INDEX => $this->decode($document[ self::DRIVER_DATA_WRAPPER_INDEX ]->bin),
self::DRIVER_TIME_WRAPPER_INDEX => (new \DateTime())->setTimestamp($document[ self::DRIVER_TIME_WRAPPER_INDEX ]->sec),
self::DRIVER_TAGS_WRAPPER_INDEX => $this->decode($document[ self::DRIVER_TAGS_WRAPPER_INDEX ]->bin),
];
} else {
return null;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$deletionResult = (array) $this->getCollection()->remove(['_id' => $item->getKey()], ["w" => 1]);
return (int) $deletionResult[ 'ok' ] === 1 && !$deletionResult[ 'err' ];
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return (bool) $this->getCollection()->drop()['ok'];
}
/**
* @return bool
* @throws MongoConnectionException
* @throws LogicException
*/
protected function driverConnect()
{
if ($this->instance instanceof MongodbClient) {
throw new LogicException('Already connected to Mongodb server');
} else {
$host = isset($this->config[ 'host' ]) ? $this->config[ 'host' ] : '127.0.0.1';
$port = isset($this->config[ 'port' ]) ? $this->config[ 'port' ] : '27017';
$timeout = isset($this->config[ 'timeout' ]) ? $this->config[ 'timeout' ] : 3;
$password = isset($this->config[ 'password' ]) ? $this->config[ 'password' ] : '';
$username = isset($this->config[ 'username' ]) ? $this->config[ 'username' ] : '';
/**
* @todo make an url builder
*/
$this->instance = $this->instance ?: (new MongodbClient('mongodb://' .
($username ?: '') .
($password ? ":{$password}" : '') .
($username ? '@' : '') . "{$host}" .
($port != '27017' ? ":{$port}" : ''), ['connectTimeoutMS' => $timeout * 1000]))->phpFastCache;
// $this->instance->Cache->createIndex([self::DRIVER_TIME_WRAPPER_INDEX => 1], ['expireAfterSeconds' => 0]);
}
}
/**
* @return \MongoCollection
*/
protected function getCollection()
{
return $this->instance->Cache;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$serverStatus = $this->getCollection()->db->command([
'serverStatus' => 1,
'recordStats' => 0,
'repl' => 0,
'metrics' => 0,
]);
$collStats = $this->getCollection()->db->command([
'collStats' => 'Cache',
'verbose' => true,
]);
$stats = (new driverStatistic())
->setInfo('MongoDB version ' . $serverStatus[ 'version' ] . ', Uptime (in days): ' . round($serverStatus[ 'uptime' ] / 86400, 1) . "\n For more information see RawData.")
->setSize((int) @$collStats[ 'size' ])
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData([
'serverStatus' => $serverStatus,
'collStats' => $collStats,
]);
return $stats;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Mongodb;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Mongodb\Driver as MongodbDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Mongodb\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(MongodbDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof MongodbDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,161 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Predis;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Predis\Client as PredisClient;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* @var PredisClient Instance of driver service
*/
public $instance;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->driverConnect();
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (extension_loaded('Redis')) {
trigger_error('The native Redis extension is installed, you should use Redis instead of Predis to increase performances', E_USER_NOTICE);
}
return class_exists('Predis\Client');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return $this->instance->setex($item->getKey(), $ttl, $this->encode($this->driverPreWrap($item)));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getKey());
if ($val == false) {
return null;
} else {
return $this->decode($val);
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->del($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->instance->flushDB();
}
/**
* @return bool
*/
protected function driverConnect()
{
$config = isset($this->config[ 'predis' ]) ? $this->config[ 'predis' ] : [];
$this->instance = new PredisClient(array_merge([
'host' => '127.0.0.1',
'port' => 6379,
'password' => null,
'database' => null,
], $config));
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$info = $this->instance->info();
$size = (isset($info['Memory']['used_memory']) ? $info['Memory']['used_memory'] : 0);
$version = (isset($info['Server']['redis_version']) ? $info['Server']['redis_version'] : 0);
$date = (isset($info['Server'][ 'uptime_in_seconds' ]) ? (new \DateTime())->setTimestamp(time() - $info['Server'][ 'uptime_in_seconds' ]) : 'unknown date');
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData($this->instance->info())
->setSize($size)
->setInfo(sprintf("The Redis daemon v%s is up since %s.\n For more information see RawData. \n Driver size includes the memory allocation size.", $version, $date->format(DATE_RFC2822)));
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Predis;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Predis\Driver as PredisDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Apc\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(PredisDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof PredisDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,165 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Redis;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
use Redis as RedisClient;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
$this->driverConnect();
}
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('Redis');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return $this->instance->setex($item->getKey(), $ttl, $this->encode($this->driverPreWrap($item)));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getKey());
if ($val == false) {
return null;
} else {
return $this->decode($val);
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->del($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->instance->flushDB();
}
/**
* @return bool
*/
protected function driverConnect()
{
if ($this->instance instanceof RedisClient) {
throw new \LogicException('Already connected to Redis server');
} else {
$this->instance = $this->instance ?: new RedisClient();
$host = isset($this->config[ 'host' ]) ? $this->config[ 'host' ] : '127.0.0.1';
$port = isset($this->config[ 'port' ]) ? (int) $this->config[ 'port' ] : '6379';
$password = isset($this->config[ 'password' ]) ? $this->config[ 'password' ] : '';
$database = isset($this->config[ 'database' ]) ? $this->config[ 'database' ] : '';
$timeout = isset($this->config[ 'timeout' ]) ? $this->config[ 'timeout' ] : '';
if (!$this->instance->connect($host, (int) $port, (int) $timeout)) {
return false;
} else {
if ($password && !$this->instance->auth($password)) {
return false;
}
if ($database) {
$this->instance->select((int) $database);
}
return true;
}
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
// used_memory
$info = $this->instance->info();
$date = (new \DateTime())->setTimestamp(time() - $info[ 'uptime_in_seconds' ]);
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData($info)
->setSize($info[ 'used_memory' ])
->setInfo(sprintf("The Redis daemon v%s is up since %s.\n For more information see RawData. \n Driver size includes the memory allocation size.", $info[ 'redis_version' ], $date->format(DATE_RFC2822)));
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Redis;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Redis\Driver as RedisDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Redis
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Redis\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(RedisDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof RedisDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,431 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Sqlite;
use PDO;
use PDOException;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\PathSeekerTrait;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpFastCache\Util\Directory;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
use PathSeekerTrait;
/**
*
*/
const FILE_DIR = 'sqlite';
/**
*
*/
const INDEXING_FILE = 'indexing';
/**
* @var int
*/
protected $maxSize = 10; // 10 mb
/**
* @var int
*/
protected $currentDB = 1;
/**
* @var string
*/
protected $SqliteDir = '';
/**
* @var \PDO
*/
protected $indexing;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} else {
if (!file_exists($this->getSqliteDir()) && !@mkdir($this->getSqliteDir(), $this->setChmodAuto(), true)) {
throw new phpFastCacheDriverException(sprintf('Sqlite cannot write in "%s", aborting...', $this->getPath()));
} else {
$this->driverConnect();
}
}
}
/**
* @return string
* @throws \phpFastCache\Exceptions\phpFastCacheCoreException
*/
public function getSqliteDir()
{
return $this->SqliteDir ?: $this->getPath() . DIRECTORY_SEPARATOR . self::FILE_DIR;
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('pdo_sqlite') && (is_writable($this->getSqliteDir()) || @mkdir($this->getSqliteDir(), $this->setChmodAuto(), true));
}
/**
* INIT NEW DB
* @param \PDO $db
*/
public function initDB(\PDO $db)
{
$db->exec('drop table if exists "caching"');
$db->exec('CREATE TABLE "caching" ("id" INTEGER PRIMARY KEY AUTOINCREMENT, "keyword" VARCHAR UNIQUE, "object" BLOB, "exp" INTEGER)');
$db->exec('CREATE UNIQUE INDEX "cleanup" ON "caching" ("keyword","exp")');
$db->exec('CREATE INDEX "exp" ON "caching" ("exp")');
$db->exec('CREATE UNIQUE INDEX "keyword" ON "caching" ("keyword")');
}
/**
* INIT Indexing DB
* @param \PDO $db
*/
public function initIndexing(\PDO $db)
{
// delete everything before reset indexing
$dir = opendir($this->SqliteDir);
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..' && $file != 'indexing' && $file != 'dbfastcache') {
unlink($this->SqliteDir . '/' . $file);
}
}
$db->exec('drop table if exists "balancing"');
$db->exec('CREATE TABLE "balancing" ("keyword" VARCHAR PRIMARY KEY NOT NULL UNIQUE, "db" INTEGER)');
$db->exec('CREATE INDEX "db" ON "balancing" ("db")');
$db->exec('CREATE UNIQUE INDEX "lookup" ON "balancing" ("keyword")');
}
/**
* INIT Instant DB
* Return Database of Keyword
* @param $keyword
* @return int
*/
public function indexing($keyword)
{
if ($this->indexing == null) {
$createTable = false;
if (!file_exists($this->SqliteDir . '/indexing')) {
$createTable = true;
}
$PDO = new PDO("sqlite:" . $this->SqliteDir . '/' . self::INDEXING_FILE);
$PDO->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
if ($createTable == true) {
$this->initIndexing($PDO);
}
$this->indexing = $PDO;
unset($PDO);
$stm = $this->indexing->prepare("SELECT MAX(`db`) as `db` FROM `balancing`");
$stm->execute();
$row = $stm->fetch(PDO::FETCH_ASSOC);
if (!isset($row[ 'db' ])) {
$db = 1;
} elseif ($row[ 'db' ] <= 1) {
$db = 1;
} else {
$db = $row[ 'db' ];
}
// check file size
$size = file_exists($this->SqliteDir . '/db' . $db) ? filesize($this->SqliteDir . '/db' . $db) : 1;
$size = round($size / 1024 / 1024, 1);
if ($size > $this->maxSize) {
$db++;
}
$this->currentDB = $db;
}
// look for keyword
$stm = $this->indexing->prepare("SELECT * FROM `balancing` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute([
':keyword' => $keyword,
]);
$row = $stm->fetch(PDO::FETCH_ASSOC);
if (isset($row[ 'db' ]) && $row[ 'db' ] != '') {
$db = $row[ 'db' ];
} else {
/*
* Insert new to Indexing
*/
$db = $this->currentDB;
$stm = $this->indexing->prepare("INSERT INTO `balancing` (`keyword`,`db`) VALUES(:keyword, :db)");
$stm->execute([
':keyword' => $keyword,
':db' => $db,
]);
}
return $db;
}
/**
* @param $keyword
* @param bool $reset
* @return PDO
*/
public function getDb($keyword, $reset = false)
{
/**
* Default is fastcache
*/
$instant = $this->indexing($keyword);
/**
* init instant
*/
if (!isset($this->instance[ $instant ])) {
// check DB Files ready or not
$createTable = false;
if (!file_exists($this->SqliteDir . '/db' . $instant) || $reset == true) {
$createTable = true;
}
$PDO = new PDO('sqlite:' . $this->SqliteDir . '/db' . $instant);
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($createTable == true) {
$this->initDB($PDO);
}
$this->instance[ $instant ] = $PDO;
unset($PDO);
}
return $this->instance[ $instant ];
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$skipExisting = isset($this->config[ 'skipExisting' ]) ? $this->config[ 'skipExisting' ] : false;
$toWrite = true;
// check in cache first
$in_cache = $this->driverRead($item);
if ($skipExisting == true) {
if ($in_cache == null) {
$toWrite = true;
} else {
$toWrite = false;
}
}
if ($toWrite == true) {
try {
$stm = $this->getDb($item->getKey())
->prepare("INSERT OR REPLACE INTO `caching` (`keyword`,`object`,`exp`) values(:keyword,:object,:exp)");
$stm->execute([
':keyword' => $item->getKey(),
':object' => $this->encode($this->driverPreWrap($item)),
':exp' => time() + $item->getTtl(),
]);
return true;
} catch (\PDOException $e) {
try {
$stm = $this->getDb($item->getKey(), true)
->prepare("INSERT OR REPLACE INTO `caching` (`keyword`,`object`,`exp`) values(:keyword,:object,:exp)");
$stm->execute([
':keyword' => $item->getKey(),
':object' => $this->encode($this->driverPreWrap($item)),
':exp' => time() + $item->getTtl(),
]);
} catch (PDOException $e) {
return false;
}
}
}
return false;
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
try {
$stm = $this->getDb($item->getKey())
->prepare("SELECT * FROM `caching` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute([
':keyword' => $item->getKey(),
]);
$row = $stm->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
try {
$stm = $this->getDb($item->getKey(), true)
->prepare("SELECT * FROM `caching` WHERE `keyword`=:keyword LIMIT 1");
$stm->execute([
':keyword' => $item->getKey(),
]);
$row = $stm->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
return null;
}
}
if (isset($row[ 'object' ])) {
return $this->decode($row[ 'object' ]);
}
return null;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
try {
$stm = $this->getDb($item->getKey())
->prepare("DELETE FROM `caching` WHERE (`exp` <= :U) OR (`keyword`=:keyword) ");
return $stm->execute([
':keyword' => $item->getKey(),
':U' => time(),
]);
} catch (PDOException $e) {
return false;
}
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
$this->instance = [];
$this->indexing = null;
// delete everything before reset indexing
$dir = opendir($this->getSqliteDir());
while ($file = readdir($dir)) {
if ($file != '.' && $file != '..') {
unlink($this->getSqliteDir() . '/' . $file);
}
}
return true;
}
/**
* @return bool
*/
protected function driverConnect()
{
if (!file_exists($this->getPath() . '/' . self::FILE_DIR)) {
if (!mkdir($this->getPath() . '/' . self::FILE_DIR, $this->setChmodAuto(), true)
) {
$this->fallback = true;
}
}
$this->SqliteDir = $this->getPath() . '/' . self::FILE_DIR;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
* @throws PDOException
*/
public function getStats()
{
$stat = new driverStatistic();
$path = $this->getFilePath(false);
if (!is_dir($path)) {
throw new phpFastCacheDriverException("Can't read PATH:" . $path, 94);
}
$stat->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData([])
->setSize(Directory::dirSize($path))
->setInfo('Number of files used to build the cache: ' . Directory::getFileCount($path));
return $stat;
}
/**
* @return array
*/
public function __sleep()
{
return array_diff(array_keys(get_object_vars($this)), ['indexing', 'instance']);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Sqlite;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Sqlite\Driver as SqliteDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Sqlite
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Sqlite\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(SqliteDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof SqliteDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,181 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Ssdb;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use phpssdb\Core\SimpleSSDB;
use phpssdb\Core\SSDB;
use phpssdb\Core\SSDBException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* @var SimpleSSDB
*/
public $instance;
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
} elseif (!$this->driverConnect()) {
throw new phpFastCacheDriverException('Ssdb is not connected, cannot continue.');
}
}
/**
* @return bool
*/
public function driverCheck()
{
static $driverCheck;
if ($driverCheck === null) {
return ($driverCheck = class_exists('phpssdb\Core\SSDB'));
}
return $driverCheck;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->setx($item->getEncodedKey(), $this->encode($this->driverPreWrap($item)), $item->getTtl());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = $this->instance->get($item->getEncodedKey());
if ($val == false) {
return null;
} else {
return $this->decode($val);
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return $this->instance->del($item->getEncodedKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return $this->instance->flushdb('kv');
}
/**
* @return bool
* @throws phpFastCacheDriverException
*/
protected function driverConnect()
{
try {
$server = isset($this->config[ 'ssdb' ]) ? $this->config[ 'ssdb' ] : [
'host' => "127.0.0.1",
'port' => 8888,
'password' => '',
'timeout' => 2000,
];
$host = $server[ 'host' ];
$port = isset($server[ 'port' ]) ? (int) $server[ 'port' ] : 8888;
$password = isset($server[ 'password' ]) ? $server[ 'password' ] : '';
$timeout = !empty($server[ 'timeout' ]) ? (int) $server[ 'timeout' ] : 2000;
$this->instance = new SimpleSSDB($host, $port, $timeout);
if (!empty($password)) {
$this->instance->auth($password);
}
if (!$this->instance) {
return false;
} else {
return true;
}
} catch (SSDBException $e) {
throw new phpFastCacheDriverCheckException('Ssdb failed to connect with error: ' . $e->getMessage(), 0, $e);
}
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stat = new driverStatistic();
$info = $this->instance->info();
/**
* Data returned by Ssdb are very poorly formatted
* using hardcoded offset of pair key-value :-(
*/
$stat->setInfo(sprintf("Ssdb-server v%s with a total of %s call(s).\n For more information see RawData.", $info[ 2 ], $info[ 6 ]))
->setRawData($info)
->setData(implode(', ', array_keys($this->itemInstances)))
->setSize($this->instance->dbsize());
return $stat;
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Ssdb;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Ssdb\Driver as SsdbDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Ssdb
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Ssdb\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(SsdbDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof SsdbDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,138 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Wincache;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('wincache') && function_exists('wincache_ucache_set');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return wincache_ucache_set($item->getKey(), $this->driverPreWrap($item), $item->getTtl());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$val = wincache_ucache_get($item->getKey(), $suc);
if ($suc === false) {
return null;
} else {
return $val;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return wincache_ucache_delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return wincache_ucache_clear();
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$memInfo = wincache_ucache_meminfo();
$info = wincache_ucache_info();
$date = (new \DateTime())->setTimestamp(time() - $info[ 'total_cache_uptime' ]);
return (new driverStatistic())
->setInfo(sprintf("The Wincache daemon is up since %s.\n For more information see RawData.", $date->format(DATE_RFC2822)))
->setSize($memInfo[ 'memory_free' ] - $memInfo[ 'memory_total' ])
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData($memInfo);
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Wincache;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Wincache\Driver as WincacheDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Wincache
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Wincache\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(WincacheDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof WincacheDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,148 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Xcache;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
return extension_loaded('xcache') && function_exists('xcache_get');
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return xcache_set($item->getKey(), $this->encode($this->driverPreWrap($item)), $item->getTtl());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$data = $this->decode(xcache_get($item->getKey()));
if ($data === false || $data === '') {
return null;
}
return $data;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return xcache_unset($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
$cnt = xcache_count(XC_TYPE_VAR);
for ($i = 0; $i < $cnt; $i++) {
xcache_clear_cache(XC_TYPE_VAR, $i);
}
return true;
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
if (!ini_get('xcache.admin.enable_auth')) {
$info = xcache_info(XC_TYPE_VAR, 0);
return (new driverStatistic())
->setSize(abs($info[ 'size' ] - $info[ 'avail' ]))
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("Xcache v%s with following modules loaded:\n %s", XCACHE_VERSION, str_replace(' ', ', ', XCACHE_MODULES)))
->setRawData($info);
} else {
throw new \RuntimeException("PhpFastCache is not able to read Xcache configuration. Please put this to your php.ini:\n
[xcache.admin]
xcache.admin.enable_auth = Off\n
Then reboot your webserver and make sure that the native Xcache ini configuration file does not override your setting.");
}
}
}

@ -0,0 +1,63 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Drivers\Xcache;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Xcache\Driver as XcacheDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Apc
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Xcache\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(XcacheDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof XcacheDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,141 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Lucas Brucksch <support@hammermaps.de>
*
*/
namespace phpFastCache\Drivers\Zenddisk;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver (zend disk cache)
* Requires Zend Data Cache Functions from ZendServer
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (extension_loaded('Zend Data Cache') && function_exists('zend_disk_cache_store')) {
return true;
} else {
return false;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return zend_disk_cache_store($item->getKey(), $this->driverPreWrap($item), ($ttl > 0 ? $ttl : 0));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$data = zend_disk_cache_fetch($item->getKey());
if ($data === false) {
return null;
}
return $data;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return zend_disk_cache_delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return @zend_disk_cache_clear();
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
$stat = new driverStatistic();
$stat->setInfo('[ZendDisk] A void info string')
->setSize(0)
->setData(implode(', ', array_keys($this->itemInstances)))
->setRawData(false);
return $stat;
}
}

@ -0,0 +1,62 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Lucas Brucksch <support@hammermaps.de>
*
*/
namespace phpFastCache\Drivers\Zenddisk;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Zenddisk\Driver as ZendDiskDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Zenddisk
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Zenddisk\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(ZendDiskDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof ZendDiskDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,149 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Lucas Brucksch <support@hammermaps.de>
*
*/
namespace phpFastCache\Drivers\Zendshm;
use phpFastCache\Core\DriverAbstract;
use phpFastCache\Core\StandardPsr6StructureTrait;
use phpFastCache\Entities\driverStatistic;
use phpFastCache\Exceptions\phpFastCacheDriverCheckException;
use phpFastCache\Exceptions\phpFastCacheDriverException;
use Psr\Cache\CacheItemInterface;
/**
* Class Driver (zend memory cache)
* Requires Zend Data Cache Functions from ZendServer
* @package phpFastCache\Drivers
*/
class Driver extends DriverAbstract
{
/**
* Driver constructor.
* @param array $config
* @throws phpFastCacheDriverException
*/
public function __construct(array $config = [])
{
$this->setup($config);
if (!$this->driverCheck()) {
throw new phpFastCacheDriverCheckException(sprintf(self::DRIVER_CHECK_FAILURE, $this->getDriverName()));
}
}
/**
* @return bool
*/
public function driverCheck()
{
if (extension_loaded('Zend Data Cache') && function_exists('zend_shm_cache_store')) {
return true;
} else {
return false;
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
* @throws \InvalidArgumentException
*/
protected function driverWrite(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
$ttl = $item->getExpirationDate()->getTimestamp() - time();
return zend_shm_cache_store($item->getKey(), $this->driverPreWrap($item), ($ttl > 0 ? $ttl : 0));
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return mixed
*/
protected function driverRead(CacheItemInterface $item)
{
$data = zend_shm_cache_fetch($item->getKey());
if ($data === false) {
return null;
}
return $data;
}
/**
* @param \Psr\Cache\CacheItemInterface $item
* @return bool
* @throws \InvalidArgumentException
*/
protected function driverDelete(CacheItemInterface $item)
{
/**
* Check for Cross-Driver type confusion
*/
if ($item instanceof Item) {
return zend_shm_cache_delete($item->getKey());
} else {
throw new \InvalidArgumentException('Cross-Driver type confusion detected');
}
}
/**
* @return bool
*/
protected function driverClear()
{
return @zend_shm_cache_clear();
}
/**
* @return bool
*/
protected function driverConnect()
{
return true;
}
/********************
*
* PSR-6 Extended Methods
*
*******************/
/**
* @return driverStatistic
*/
public function getStats()
{
if(function_exists('zend_shm_cache_info')) {
$stats = (array)zend_shm_cache_info();
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo(sprintf("The Zend memory have %d item(s) in cache.\n For more information see RawData.", $stats['items_total']))
->setRawData($stats)
->setSize($stats['memory_total']);
} else {
/** zend_shm_cache_info supported V8 or higher */
return (new driverStatistic())
->setData(implode(', ', array_keys($this->itemInstances)))
->setInfo("The Zend memory statistics is only supported by ZendServer V8 or higher")
->setRawData(null)
->setSize(0);
}
}
}

@ -0,0 +1,62 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Lucas Brucksch <support@hammermaps.de>
*
*/
namespace phpFastCache\Drivers\Zendshm;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\Cache\ExtendedCacheItemPoolInterface;
use phpFastCache\Cache\ItemBaseTrait;
use phpFastCache\Drivers\Zendshm\Driver as ZendSHMDriver;
/**
* Class Item
* @package phpFastCache\Drivers\Zendshm
*/
class Item implements ExtendedCacheItemInterface
{
use ItemBaseTrait;
/**
* Item constructor.
* @param \phpFastCache\Drivers\Zendshm\Driver $driver
* @param $key
* @throws \InvalidArgumentException
*/
public function __construct(ZendSHMDriver $driver, $key)
{
if (is_string($key)) {
$this->key = $key;
$this->driver = $driver;
$this->driver->setItem($this);
$this->expirationDate = new \DateTime();
} else {
throw new \InvalidArgumentException(sprintf('$key must be a string, got type "%s" instead.', gettype($key)));
}
}
/**
* @param ExtendedCacheItemPoolInterface $driver
* @throws \InvalidArgumentException
* @return static
*/
public function setDriver(ExtendedCacheItemPoolInterface $driver)
{
if ($driver instanceof ZendSHMDriver) {
$this->driver = $driver;
return $this;
} else {
throw new \InvalidArgumentException('Invalid driver instance');
}
}
}

@ -0,0 +1,227 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Entities;
use ArrayAccess;
use InvalidArgumentException;
use LogicException;
/**
* Class driverStatistic
* @package phpFastCache\Entities
*/
class driverStatistic implements ArrayAccess
{
/**
* @var string
*/
protected $info = '';
/**
* @var string
*/
protected $size = 0;
/**
* @var string
*/
protected $data = '';
/**
* @var mixed
*/
protected $rawData;
/**
* @return string|bool Return infos or false if no information available
*/
public function getInfo()
{
return $this->info;
}
/**
* @return int|bool Return size in octet or false if no information available
*/
public function getSize()
{
return $this->size;
}
/**
* @return mixed
*/
public function getData()
{
return $this->data;
}
/**
* @param $info
* @return $this
*/
public function setInfo($info)
{
$this->info = ($info ?: '');
return $this;
}
/**
* @param int $size
* @return $this
*/
public function setSize($size)
{
$this->size = ($size ?: 0);
return $this;
}
/**
* @param mixed $data
* @return $this
*/
public function setData($data)
{
$this->data = ($data ?: '');
return $this;
}
/**
* @return mixed
*/
public function getRawData()
{
return $this->rawData;
}
/**
* @param mixed $raw
* @return $this
*/
public function setRawData($raw)
{
$this->rawData = $raw;
return $this;
}
/**
* @return array
*/
public function getPublicDesc()
{
return[
'Info' => 'Cache Information',
'Size' => 'Cache Size',
'Data' => 'Cache items keys',
'RawData' => 'Cache raw data',
];
}
/*****************
* ArrayAccess
*****************/
/**
* @param string $offset
* @param string $value
* @throws InvalidArgumentException
* @throws LogicException
*/
public function offsetSet($offset, $value)
{
trigger_error($this->getDeprecatedMsg(), E_USER_DEPRECATED);
if (!is_string($offset)) {
throw new InvalidArgumentException('$offset must be a string');
} else {
if (property_exists($this, $offset)) {
$this->{$offset} = $value;
} else {
throw new LogicException("Property {$offset} does not exists");
}
}
}
/**
* @param string $offset
* @return bool
* @throws InvalidArgumentException
* @throws LogicException
*/
public function offsetExists($offset)
{
trigger_error($this->getDeprecatedMsg(), E_USER_DEPRECATED);
if (!is_string($offset)) {
throw new InvalidArgumentException('$offset must be a string');
} else {
if (property_exists($this, $offset)) {
return isset($this->{$offset});
} else {
throw new LogicException("Property {$offset} does not exists");
}
}
}
/**
* @param string $offset
* @throws InvalidArgumentException
* @throws LogicException
*/
public function offsetUnset($offset)
{
trigger_error($this->getDeprecatedMsg(), E_USER_DEPRECATED);
if (!is_string($offset)) {
throw new InvalidArgumentException('$offset must be a string');
} else {
if (property_exists($this, $offset)) {
unset($this->{$offset});
} else {
throw new LogicException("Property {$offset} does not exists");
}
}
}
/**
* @param string $offset
* @return string
* @throws InvalidArgumentException
* @throws LogicException
*/
public function offsetGet($offset)
{
trigger_error($this->getDeprecatedMsg(), E_USER_DEPRECATED);
if (!is_string($offset)) {
throw new InvalidArgumentException('$offset must be a string');
} else {
if (property_exists($this, $offset)) {
return isset($this->{$offset}) ? $this->{$offset} : null;
} else {
throw new LogicException("Property {$offset} does not exists");
}
}
}
/**
* @return string
*/
private function getDeprecatedMsg()
{
return 'You should consider upgrading your code and treat the statistic array as an object.
The arrayAccess compatibility will be removed in the next major release';
}
}

@ -12,4 +12,13 @@
* *
*/ */
require_once __DIR__."/phpFastCache/phpFastCache.php"; namespace phpFastCache\Exceptions;
/**
* Class phpFastCacheDriverCheckException
* @package phpFastCache\Exceptions
*/
class phpFastCacheDriverCheckException extends phpFastCacheDriverException
{
}

@ -0,0 +1,83 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Proxy;
use phpFastCache\Cache\ExtendedCacheItemInterface;
use phpFastCache\CacheManager;
use phpFastCache\Entities\driverStatistic;
use Psr\Cache\CacheItemInterface;
/**
* Class phpFastCache
*
* Handle methods using annotations for IDE
* because they're handled by __call()
* Check out ExtendedCacheItemInterface to see all
* the drivers methods magically implemented
*
* @method ExtendedCacheItemInterface getItem($key) Retrieve an item and returns an empty item if not found
* @method ExtendedCacheItemInterface[] getItems(array $keys) Retrieve an item and returns an empty item if not found
* @method bool hasItem() hasItem($key) Tests if an item exists
* @method bool deleteItem(string $key) Delete an item
* @method bool deleteItems(array $keys) Delete some items
* @method bool save(CacheItemInterface $item) Save an item
* @method bool saveDeferred(CacheItemInterface $item) Sets a cache item to be persisted later
* @method bool commit() Persists any deferred cache items
* @method bool clear() Allow you to completely empty the cache and restart from the beginning
* @method driverStatistic stats() Returns a driverStatistic object
* @method ExtendedCacheItemInterface getItemsByTag($tagName) Return items by a tag
* @method ExtendedCacheItemInterface[] getItemsByTags(array $tagNames) Return items by some tags
* @method bool deleteItemsByTag($tagName) Delete items by a tag
* @method bool deleteItemsByTags(array $tagNames) // Delete items by some tags
* @method void incrementItemsByTag($tagName, $step = 1) // Increment items by a tag
* @method void incrementItemsByTags(array $tagNames, $step = 1) // Increment items by some tags
* @method void decrementItemsByTag($tagName, $step = 1) // Decrement items by a tag
* @method void decrementItemsByTags(array $tagNames, $step = 1) // Decrement items by some tags
* @method void appendItemsByTag($tagName, $data) // Append items by a tag
* @method void appendItemsByTags(array $tagNames, $data) // Append items by a tags
* @method void prependItemsByTag($tagName, $data) // Prepend items by a tag
* @method void prependItemsByTags(array $tagNames, $data) // Prepend items by a tags
*/
abstract class phpFastCacheAbstractProxy
{
/**
* @var \phpFastCache\Cache\ExtendedCacheItemPoolInterface
*/
protected $instance;
/**
* phpFastCache constructor.
* @param string $driver
* @param array $config
*/
public function __construct($driver = 'auto', array $config = [])
{
$this->instance = CacheManager::getInstance($driver, $config);
}
/**
* @param $name
* @param $args
* @return mixed
* @throws \BadMethodCallException
*/
public function __call($name, $args)
{
if(method_exists($this->instance, $name)){
return call_user_func_array([$this->instance, $name], $args);
}else{
throw new \BadMethodCallException(sprintf('Method %s does not exists', $name));
}
}
}

@ -0,0 +1,143 @@
<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Khoa Bui (khoaofgod) <khoaofgod@gmail.com> http://www.phpfastcache.com
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
namespace phpFastCache\Util;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;
/**
* Class Directory
* @package phpFastCache\Util
*/
class Directory
{
/**
* Get the directory size
* @param string $directory
* @param bool $includeDirAllocSize
* @return integer
*/
public static function dirSize($directory, $includeDirAllocSize = false)
{
$size = 0;
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) {
/**
* @var \SplFileInfo $file
*/
if ($file->isFile()) {
$size += filesize($file->getRealPath());
} else if ($includeDirAllocSize) {
$size += $file->getSize();
}
}
return $size;
}
/**
* @param string $path
* @return int
*/
public static function getFileCount($path)
{
$count = 0;
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $object) {
/**
* @var \SplFileInfo $object
*/
if ($object->isFile()) {
$count++;
}
}
return $count;
}
/**
* Recursively delete a directory and all of it's contents - e.g.the equivalent of `rm -r` on the command-line.
* Consistent with `rmdir()` and `unlink()`, an E_WARNING level error will be generated on failure.
*
* @param string $source absolute path to directory or file to delete.
* @param bool $removeOnlyChildren set to true will only remove content inside directory.
*
* @return bool true on success; false on failure
*/
public static function rrmdir($source, $removeOnlyChildren = false)
{
if (empty($source) || file_exists($source) === false) {
return false;
}
if (is_file($source) || is_link($source)) {
return unlink($source);
}
$files = new RecursiveIteratorIterator
(
new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($files as $fileinfo) {
/**
* @var SplFileInfo $fileinfo
*/
if ($fileinfo->isDir()) {
if (self::rrmdir($fileinfo->getRealPath()) === false) {
return false;
}
} else if(unlink($fileinfo->getRealPath()) === false) {
return false;
}
}
if ($removeOnlyChildren === false) {
return rmdir($source);
}
return true;
}
/**
* Alias of realpath() but work
* on non-existing files
*
* @param $path
* @return string
*/
public static function getAbsolutePath($path)
{
$parts = preg_split('~[/\\\\]+~', $path, 0, PREG_SPLIT_NO_EMPTY);
$absolutes = [];
foreach ($parts as $part) {
if ('.' === $part) {
continue;
}
if ('..' === $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
/**
* Allows to dereference char
*/
$__FILE__ = preg_replace('~^(([a-z0-9\-]+)://)~', '', __FILE__);// remove file protocols such as "phar://" etc.
$prefix = $__FILE__[0] === DIRECTORY_SEPARATOR ? DIRECTORY_SEPARATOR : '';
return $prefix . implode(DIRECTORY_SEPARATOR, $absolutes);
}
}

@ -13,6 +13,7 @@
*/ */
namespace phpFastCache\Util; namespace phpFastCache\Util;
use phpFastCache\Exceptions\phpFastCacheCoreException; use phpFastCache\Exceptions\phpFastCacheCoreException;
@ -26,13 +27,12 @@ class Languages
{ {
public static function setEncoding($encoding = 'UTF-8', $language = null) public static function setEncoding($encoding = 'UTF-8', $language = null)
{ {
if ($language === null || !in_array($language, array('uni', 'Japanese', 'ja', 'English', 'en'), true)) { if ($language === null || !in_array($language, ['uni', 'Japanese', 'ja', 'English', 'en'], true)) {
$language = 'uni'; $language = 'uni';
} }
switch(strtoupper($encoding)) switch (strtoupper($encoding)) {
{
case 'UTF-8': case 'UTF-8':
if(extension_loaded("mbstring")) { if (extension_loaded("mbstring")) {
mb_internal_encoding($encoding); mb_internal_encoding($encoding);
mb_http_output($encoding); mb_http_output($encoding);
mb_http_input($encoding); mb_http_input($encoding);

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save