mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-09-06 13:14:18 +08:00
Added apc cache for config files
Loggin improvements
This commit is contained in:
parent
ef7f8bddb3
commit
0af6fbadaa
5 changed files with 149 additions and 18 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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', ''),
|
||||
|
|
|
@ -186,4 +186,13 @@ class Api
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function LogoutCurrentLogginedUser()
|
||||
{
|
||||
\RainLoop\Utils::ClearCookie('rlsession');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue