diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 0be3ffa3d..332b54de4 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -1999,14 +1999,28 @@ class Utils } /** - * @param string $sFunctionName + * @param string|array $mFunctionNameOrNames * * @return bool */ - public static function FunctionExistsAndEnabled($sFunctionName) + public static function FunctionExistsAndEnabled($mFunctionNameOrNames) { static $aCache = null; - if (empty($sFunctionName) || !\function_exists($sFunctionName) || !\is_callable($sFunctionName)) + + if (\is_array($mFunctionNameOrNames)) + { + foreach ($mFunctionNameOrNames as $sFunctionName) + { + if (!\MailSo\Base\Utils::FunctionExistsAndEnabled($sFunctionName)) + { + return false; + } + } + + return true; + } + + if (empty($mFunctionNameOrNames) || !\function_exists($mFunctionNameOrNames) || !\is_callable($mFunctionNameOrNames)) { return false; } @@ -2017,7 +2031,7 @@ class Utils $sDisableFunctions = \is_string($sDisableFunctions) && 0 < \strlen($sDisableFunctions) ? $sDisableFunctions : ''; $aCache = \explode(',', $sDisableFunctions); - $aCache = is_array($aCache) && 0 < count($aCache) ? $aCache : array(); + $aCache = \is_array($aCache) && 0 < \count($aCache) ? $aCache : array(); if (\extension_loaded('suhosin')) { @@ -2025,17 +2039,17 @@ class Utils $sSuhosin = \is_string($sSuhosin) && 0 < \strlen($sSuhosin) ? $sSuhosin : ''; $aSuhosinCache = \explode(',', $sSuhosin); - $aSuhosinCache = is_array($aSuhosinCache) && 0 < count($aSuhosinCache) ? $aSuhosinCache : array(); + $aSuhosinCache = \is_array($aSuhosinCache) && 0 < \count($aSuhosinCache) ? $aSuhosinCache : array(); if (0 < \count($aSuhosinCache)) { - $aCache = array_merge($aCache, $aSuhosinCache); - $aCache = array_unique($aCache); + $aCache = \array_merge($aCache, $aSuhosinCache); + $aCache = \array_unique($aCache); } } } - return !\in_array($sFunctionName, $aCache); + return !\in_array($mFunctionNameOrNames, $aCache); } /** diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 7e0c5186b..a0aae1f8d 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -673,16 +673,22 @@ class Actions switch (true) { - case 'APC' === $sDriver && \MailSo\Base\Utils::FunctionExistsAndEnabled('apc_store'): + case ('APC' === $sDriver || 'APCU' === $sDriver) && + \MailSo\Base\Utils::FunctionExistsAndEnabled(array( + 'apc_store', 'apc_fetch', 'apc_delete', 'apc_clear_cache')): + $oDriver = \MailSo\Cache\Drivers\APC::NewInstance(); break; - case 'MEMCACHE' === $sDriver && \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): - case 'MEMCACHED' === $sDriver && \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): + + case ('MEMCACHE' === $sDriver || 'MEMCACHED' === $sDriver) && + \MailSo\Base\Utils::FunctionExistsAndEnabled('memcache_connect'): + $oDriver = \MailSo\Cache\Drivers\Memcache::NewInstance( $this->Config()->Get('labs', 'fast_cache_memcache_host', '127.0.0.1'), (int) $this->Config()->Get('labs', 'fast_cache_memcache_port', 11211) ); break; + default: $oDriver = \MailSo\Cache\Drivers\File::NewInstance(APP_PRIVATE_DATA.'cache'); break; @@ -749,9 +755,17 @@ class Actions $this->oLogger->WriteEmptyLine(); $oHttp = $this->Http(); + $this->oLogger->Write('[DATE:'.\gmdate('d.m.y').'][RL:'.APP_VERSION.'][PHP:'.PHP_VERSION.'][IP:'. $oHttp->GetClientIp().'][PID:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('getmypid') ? \getmypid() : 'unknown'). '][GUID:'.\MailSo\Log\Logger::Guid().']'); + + $this->oLogger->Write( + '[APC:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('apc_fetch') ? 'on' : 'off').']'. + '[MB:'.(\MailSo\Base\Utils::FunctionExistsAndEnabled('mb_convert_encoding') ? 'on' : 'off').']'. + '[PDO:'.(\class_exists('PDO') ? \implode(',', \PDO::getAvailableDrivers()) : 'off').']'. + '[Streams:'.\implode(',', \stream_get_transports()).']' + ); $this->oLogger->Write( '['.$oHttp->GetMethod().'] '.$oHttp->GetScheme().'://'.$oHttp->GetHost(false, false).$oHttp->GetServer('REQUEST_URI', ''), diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php index 7d3db27da..750fbf377 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Api.php @@ -186,4 +186,13 @@ class Api return false; } + + /** + * @return bool + */ + public static function LogoutCurrentLogginedUser() + { + \RainLoop\Utils::ClearCookie('rlsession'); + return false; + } } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php index 143aa231e..4f3f623c6 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php @@ -14,22 +14,30 @@ abstract class AbstractConfig */ private $aData; + /** + * @var bool + */ + private $bUseApcCache; + /** * @var string */ - protected $sFilePrefix; + private $sFileHeader; /** * @param string $sFileName - * @param string $sFilePrefix = '' + * @param string $sFileHeader = '' * * @return void */ - public function __construct($sFileName, $sFilePrefix = '') + public function __construct($sFileName, $sFileHeader = '') { $this->sFile = \APP_PRIVATE_DATA.'configs/'.$sFileName; - $this->sFilePrefix = $sFilePrefix; + $this->sFileHeader = $sFileHeader; $this->aData = $this->defaultValues(); + + $this->bUseApcCache = APP_USE_APC_CACHE && + \MailSo\Base\Utils::FunctionExistsAndEnabled(array('apc_fetch', 'apc_store')); } /** @@ -42,7 +50,7 @@ abstract class AbstractConfig */ public function IsInited() { - return is_array($this->aData) && 0 < count($this->aData); + return \is_array($this->aData) && 0 < \count($this->aData); } /** @@ -73,7 +81,7 @@ abstract class AbstractConfig { if (isset($this->aData[$sSectionKey][$sParamKey][0])) { - $sType = gettype($this->aData[$sSectionKey][$sParamKey][0]); + $sType = \gettype($this->aData[$sSectionKey][$sParamKey][0]); switch ($sType) { default: @@ -96,6 +104,82 @@ abstract class AbstractConfig } } + /** + * @return string + */ + private function cacheKey() + { + return 'config:'.\sha1($this->sFile).':'; + } + + /** + * @return bool + */ + private function loadDataFromCache() + { + if ($this->bUseApcCache) + { + $iMTime = @\filemtime($this->sFile); + if (\is_int($iMTime) && 0 < $iMTime) + { + $sKey = $this->cacheKey(); + + $iTime = \apc_fetch($sKey.'time'); + if ($iTime && $iMTime === (int) $iTime) + { + $aFetchData = \apc_fetch($sKey.'data'); + if (\is_array($aFetchData)) + { + $this->aData = $aFetchData; + return true; + } + } + } + } + + return false; + } + + /** + * @return bool + */ + private function storeDataToCache() + { + if ($this->bUseApcCache) + { + $iMTime = @\filemtime($this->sFile); + if (\is_int($iMTime) && 0 < $iMTime) + { + $sKey = $this->cacheKey(); + + \apc_store($sKey.'time', $iMTime); + \apc_store($sKey.'data', $this->aData); + + return true; + } + } + + return false; + } + + /** + * @return bool + */ + private function clearCache() + { + if ($this->bUseApcCache) + { + $sKey = $this->cacheKey(); + + \apc_delete($sKey.'time'); + \apc_delete($sKey.'data'); + + return true; + } + + return false; + } + /** * @return bool */ @@ -103,6 +187,11 @@ abstract class AbstractConfig { if (\file_exists($this->sFile) && \is_readable($this->sFile)) { + if ($this->loadDataFromCache()) + { + return true; + } + $aData = @\parse_ini_file($this->sFile, true); if (\is_array($aData) && 0 < count($aData)) { @@ -117,6 +206,8 @@ abstract class AbstractConfig } } + $this->storeDataToCache(); + return true; } } @@ -191,8 +282,9 @@ abstract class AbstractConfig } } + $this->clearCache(); return false !== \file_put_contents($this->sFile, - (0 < \strlen($this->sFilePrefix) ? $this->sFilePrefix : ''). + (0 < \strlen($this->sFileHeader) ? $this->sFileHeader : ''). $sNewLine.\implode($sNewLine, $aResultLines)); } } diff --git a/rainloop/v/0.0.0/index.php b/rainloop/v/0.0.0/index.php index 3591fc90c..4612b95a0 100644 --- a/rainloop/v/0.0.0/index.php +++ b/rainloop/v/0.0.0/index.php @@ -24,6 +24,8 @@ Options -Indexes define('APP_REQUEST_RND', md5(APP_START.rand(10000, 99999).APP_START)); define('APP_VERSION_ROOT_PATH', APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/'); + define('APP_USE_APC_CACHE', true); + $sCustomDataPath = ''; if (file_exists(APP_INDEX_ROOT_PATH.'include.php')) {