Skip to content

Commit

Permalink
Поддержка redis для кэширования и сессий;
Browse files Browse the repository at this point in the history
Порция рефакторинга для кэширования;
cmsCacheMemory переименован в cmsCacheMemcache;
Для поля "Число", если включена опция "только целые числа", сохраняемое значение приводится к типу int вместо float;
Исправлен поиск иконок с символом дефиса.
  • Loading branch information
fuzegit committed Jan 11, 2025
1 parent 6bbd301 commit 3d29dc5
Show file tree
Hide file tree
Showing 19 changed files with 411 additions and 148 deletions.
2 changes: 1 addition & 1 deletion install/steps/php.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ function check_requirements() {

$min_php_version = '7.2.0';
$extensions = ['date', 'gd', 'json', 'mbstring', 'mysqli', 'session', 'filter', 'fileinfo'];
$extensions_extra = ['ftp', 'memcache', 'memcached', 'zip', 'curl'];
$extensions_extra = ['ftp', 'memcache', 'memcached', 'redis', 'zip', 'curl'];

sort($extensions);
sort($extensions_extra);
Expand Down
2 changes: 1 addition & 1 deletion system/config/version.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
major = 2
minor = 17
build = 1
date = 20250110
date = 20250111
2 changes: 1 addition & 1 deletion system/controllers/admin/actions/cache_delete.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class actionAdminCacheDelete extends cmsAction {

public function run($method) {

if (!in_array($method, ['files', 'memory', 'memcached'])) {
if (!in_array($method, ['files', 'memory', 'memcached', 'redis'])) {
return cmsCore::error404();
}

Expand Down
187 changes: 102 additions & 85 deletions system/controllers/admin/actions/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,93 +19,11 @@ public function run($do = false) {
$values = array_merge($values, $form->parse($this->request, true));
$errors = $form->validate($this, $values);

if ($values['session_save_handler'] == 'memcache' && !class_exists('Memcache')){

$errors['session_save_handler'] = LANG_CP_MEMCACHE_NOT_AVAILABLE;

} else if($values['session_save_handler'] == 'memcached' && !class_exists('Memcached')){

$errors['session_save_handler'] = LANG_CP_MEMCACHE_NOT_AVAILABLE;

} else if($values['session_save_handler'] == 'files'){

if(!is_dir($values['session_save_path'])){
if(!mkdir($values['session_save_path'], 0755, true)){
$errors['session_save_path'] = LANG_CP_FTP_MKDIR_FAILED;
}
}

if (!is_writable($values['session_save_path'])) {
$errors['session_save_path'] = sprintf(LANG_CP_INSTALL_NOT_WRITABLE, $errors['session_save_path']);
}

if (!$errors) {
list($values, $errors) = $this->checkCacheHandler($values, $errors);
}

if (!$errors){

if ($values['cache_method'] == 'memory'){

if (!class_exists('Memcache')){

cmsUser::addSessionMessage(LANG_CP_MEMCACHE_NOT_AVAILABLE, 'error');

$values['cache_method'] = 'files';

} else {

$memcache_tester = new Memcache();

$memcache_result = $memcache_tester->connect($values['cache_host'], $values['cache_port']);

if (!$memcache_result){

cmsUser::addSessionMessage(LANG_CP_MEMCACHE_CONNECT_ERROR, 'error');

$values['cache_method'] = 'files';

}

}

}

if ($values['cache_method'] == 'memcached'){

if (!class_exists('Memcached')){

cmsUser::addSessionMessage(LANG_CP_MEMCACHE_NOT_AVAILABLE, 'error');

$values['cache_method'] = 'files';

} else {

$memcache_tester = new Memcached();

$memcache_tester->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);

$memcache_result = $memcache_tester->addServer($values['cache_host'], $values['cache_port']);

if (!$memcache_result){

cmsUser::addSessionMessage(LANG_CP_MEMCACHE_CONNECT_ERROR, 'error');

$values['cache_method'] = 'files';

}

}

}

if (!$values['cache_enabled']){

$cacher = cmsCache::getCacher((object)array_merge($this->cms_config->getAll(), $values));

$cacher->start();
$cacher->clean();
$cacher->stop();

}
if (!$errors) {

if($values['db_charset'] !== $this->cms_config->db_charset){

Expand Down Expand Up @@ -201,4 +119,103 @@ public function run($do = false) {
]);
}

private function checkCacheHandler($values, $errors) {

// Новый конфиг согласно настройкам
$new_config = clone $this->cms_config;
$new_config->setData(array_merge($this->cms_config->getConfig(), $values));

// Сессии
switch ($values['session_save_handler']) {
case 'files':

if(!is_dir($values['session_save_path'])){
if(!mkdir($values['session_save_path'], 0755, true)){
$errors['session_save_path'] = LANG_CP_FTP_MKDIR_FAILED;
}
}

if (!is_writable($values['session_save_path'])) {
$errors['session_save_path'] = sprintf(LANG_CP_INSTALL_NOT_WRITABLE, $values['session_save_path']);
}

break;

default:

list($host, $port) = explode(':', str_replace('tcp://', '', $values['session_save_path']));

$new_config->cache_method = $values['session_save_handler'];
$new_config->cache_host = $host;
$new_config->cache_port = $port;

$cacher = cmsCache::getCacher($new_config);

$check = $this->checkCacher($cacher);

if ($check < 1) {
$errors['session_save_handler'] = sprintf(
($check === -1 ? LANG_CP_CACHE_MOD_NOT_AVAILABLE : LANG_CP_CACHE_MOD_CONNECT_ERROR),
$values['session_save_handler']
);
}

break;
}

if ($errors) {
return [$values, $errors];
}

// Кэширование

$new_config->cache_method = $values['cache_method'];
$new_config->cache_host = $values['cache_host'];
$new_config->cache_port = $values['cache_port'];

$cacher = cmsCache::getCacher($new_config);

$check = $this->checkCacher($cacher);

if ($check < 1) {
$errors['cache_method'] = sprintf(
($check === -1 ? LANG_CP_CACHE_MOD_NOT_AVAILABLE : LANG_CP_CACHE_MOD_CONNECT_ERROR),
$values['cache_method']
);
}

if ($errors) {
return [$values, $errors];
}

// Был включен кэш, выключили
if (!$values['cache_enabled'] && $this->cms_config->cache_enabled) {

$this->cms_cache->clean();
$this->cms_cache->stop();
}

return [$values, $errors];
}

private function checkCacher($cacher) {

if (!$cacher->isDependencySatisfied()) {
return -1;
}

try {

$cacher->start();

$success = $cacher->testConnection();

} catch (Throwable $e) {

$success = 0;
}

return $success;
}

}
59 changes: 44 additions & 15 deletions system/controllers/admin/forms/form_settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,23 @@ public function init() {
}
}

$cache_modules = [];
$cache_exts = cmsCore::getFilesList('system/core', 'cache*.php', true);
foreach ($cache_exts as $cache_ext) {

$name = preg_replace('#^cache#ui', '', $cache_ext);

if (!$name) {
continue;
}

$cacher_class = 'cmsCache' . string_to_camel('_', $name);

$cacher = new $cacher_class(cmsConfig::getInstance());

$cache_modules[$name] = ucfirst($name) . ($cacher->isDependencySatisfied() ? '' : ' (' . LANG_CP_SETTINGS_CACHE_METHOD_NO . ')');
}

return [
[
'type' => 'fieldset',
Expand Down Expand Up @@ -236,6 +253,10 @@ public function init() {
new fieldNumber('production_time', [
'title' => LANG_CP_SETTINGS_PRODUCTION_TIME,
'hint' => LANG_CP_SETTINGS_PRODUCTION_TIME_HINT,
'options' => [
'is_abs' => true,
'is_ceil' => true
],
'default' => time()
])
]
Expand Down Expand Up @@ -299,7 +320,11 @@ public function init() {
'visible_depend' => ['mail_transport' => ['show' => ['smtp']]]
]),
new fieldNumber('mail_smtp_port', [
'title' => LANG_CP_SETTINGS_MAIL_SMTP_PORT,
'title' => LANG_CP_SETTINGS_MAIL_SMTP_PORT,
'options' => [
'is_abs' => true,
'is_ceil' => true
],
'visible_depend' => ['mail_transport' => ['show' => ['smtp']]]
]),
new fieldCheckbox('mail_smtp_auth', [
Expand Down Expand Up @@ -334,30 +359,34 @@ public function init() {
'title' => LANG_CP_SETTINGS_CACHE_ENABLED
]),
new fieldNumber('cache_ttl', [
'title' => LANG_CP_SETTINGS_CACHE_TTL,
'title' => LANG_CP_SETTINGS_CACHE_TTL,
'options' => [
'is_abs' => true,
'is_ceil' => true
],
'visible_depend' => ['cache_enabled' => ['show' => ['1']]]
]),
new fieldList('cache_method', [
'title' => LANG_CP_SETTINGS_CACHE_METHOD,
'hint' => !cmsConfig::get('cache_enabled') ? '' : sprintf(LANG_CP_SETTINGS_CACHE_CLEAN_MERGED, href_to('admin', 'cache_delete', cmsConfig::get('cache_method'))),
'items' => [
'files' => 'Files',
'memory' => 'Memcache' . (extension_loaded('memcache') ? '' : ' (' . LANG_CP_SETTINGS_CACHE_METHOD_NO . ')'),
'memcached' => 'Memcached' . (extension_loaded('memcached') ? '' : ' (' . LANG_CP_SETTINGS_CACHE_METHOD_NO . ')'),
],
'items' => $cache_modules,
'visible_depend' => ['cache_enabled' => ['show' => ['1']]]
]),
new fieldString('cache_host', [
'title' => LANG_CP_SETTINGS_CACHE_HOST,
'visible_depend' => [
'cache_method' => ['show' => ['memory', 'memcached']],
'cache_method' => ['hide' => ['files']],
'cache_enabled' => ['hide' => ['0']]
]
]),
new fieldNumber('cache_port', [
'title' => LANG_CP_SETTINGS_CACHE_PORT,
'title' => LANG_CP_SETTINGS_CACHE_PORT,
'options' => [
'is_abs' => true,
'is_ceil' => true
],
'visible_depend' => [
'cache_method' => ['show' => ['memory', 'memcached']],
'cache_method' => ['hide' => ['files']],
'cache_enabled' => ['hide' => ['0']]
]
])
Expand All @@ -369,11 +398,7 @@ public function init() {
'childs' => [
new fieldList('session_save_handler', [
'title' => LANG_CP_SETTINGS_SESSIONS_SAVE_HANDLER,
'items' => [
'files' => 'Files',
'memcache' => 'Memcache' . (extension_loaded('memcache') ? '' : ' (' . LANG_CP_SETTINGS_CACHE_METHOD_NO . ')'),
'memcached' => 'Memcached' . (extension_loaded('memcached') ? '' : ' (' . LANG_CP_SETTINGS_CACHE_METHOD_NO . ')'),
],
'items' => $cache_modules,
'rules' => [
['required']
]
Expand All @@ -396,6 +421,10 @@ public function init() {
'title' => LANG_CP_SETTINGS_SESSION_MAXLIFETIME,
'default' => ini_get('session.gc_maxlifetime') / 60,
'units' => LANG_MINUTES,
'options' => [
'is_abs' => true,
'is_ceil' => true
],
'rules' => [
['required'],
['min', 1]
Expand Down
4 changes: 2 additions & 2 deletions system/core/cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ public static function getInstance() {

/**
*
* @param stdClass|cmsConfig $config
* @param cmsConfigs $config
* @return \cmsCache*
*/
public static function getCacher($config) {
public static function getCacher(cmsConfigs $config) {

$cacher_class = 'cmsCache' . string_to_camel('_', $config->cache_method);

Expand Down
10 changes: 9 additions & 1 deletion system/core/cachefiles.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ class cmsCacheFiles {

private $cache_path;

public function __construct($config) {
public function isDependencySatisfied() {
return is_writable($this->cache_path);
}

public function __construct(cmsConfigs $config) {
$this->cache_path = $config->cache_path . 'data/';
}

Expand Down Expand Up @@ -93,6 +97,10 @@ public function stop() {
return true;
}

public function testConnection() {
return 1;
}

public function getStats() {
return [];
}
Expand Down
Loading

0 comments on commit 3d29dc5

Please sign in to comment.