v 1.4.0
- Updated local libraries - PHP 7.1 support - New, proper caching method - Special cache folder
This commit is contained in:
223
lib/phpfastcache/src/phpFastCache/Drivers/Mongodb/Driver.php
Normal file
223
lib/phpfastcache/src/phpFastCache/Drivers/Mongodb/Driver.php
Normal file
@@ -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;
|
||||
}
|
||||
}
|
63
lib/phpfastcache/src/phpFastCache/Drivers/Mongodb/Item.php
Normal file
63
lib/phpfastcache/src/phpFastCache/Drivers/Mongodb/Item.php
Normal file
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user