Перейти к публикации

Рекомендованные сообщения

Исходник: сайт с включенным кешированием через Memcache или Redis (это важно!), так же включено кеширование счётчика (не проверял этот пункт).

Действия: заходим на главную страницу и запоминаем название публикации, потом заходим напрямую в БД и меняем title той публикации. Возвращаемся на главную страницу и обновляем её. Мы видим старое название, всё правильно, оно закешировалось, так и должно работать! На всякий случай идём в админку, жмём кнопку "Очистить кеш", проверяем главную страницу и видим изменённое название, всё хорошо, повторяем начальные действия, но кеш не очищаем! Далее...

Рассмотрим несколько ситуация.

 

1. Прямое удаление файла.

Заходим в папку "engine\cache\system" и удаляем там файл "cron.php" (с другими файлами такое не работает).

Результат: мы видим изменённое название (которое меняли напрямую в БД), т.е. кеш сбрасывается(или просто сгенерировался новый) и на главной странице и в FullStory. Так и должно быть?

 

2. Запуск очистки кеша сторонним скриптом.

Заходим в админку, и смотрим как вызывается кнопка "Очистить кеш", видим что-то такое: "engine/ajax/controller.php?mod=adminfunction&action=clearcache&user_hash={$dle_login_hash}" сходили посмотрели и понимаешь, что вызывается функция очистки кеша из файла "/inc/include/functions.inc.php", а именно "clear_all_caches()" всё понятно, пробуем эмулировать в стороннем php скрипте.

Пишем код в папке движка в левом файле:

<?
define ( 'DATALIFEENGINE', true );
define ( 'ROOT_DIR', dirname(dirname(__FILE__)) );
define ( 'ENGINE_DIR', ROOT_DIR . '' );

include_once ENGINE_DIR . '/classes/plugins.class.php';
include_once(DLEPlugins::Check(ENGINE_DIR . '/inc/include/functions.inc.php'));

clear_all_caches(); // Удаляет файлы из папки кеша, вызывает clear_cache() и возможно opcache_reset()
clear_static_cache_id(); // генерирует 5ти значную строку

// @unlink( ENGINE_DIR . "/cache/system/cron.php" ); // если добавить эту строку то будет норм, но мне не понятен механизм, связанный с удалением этого файла


var_dump('END');

Результат: все файлы из папки "engine\cache\system" удаляются успешно (кроме cron.php, по условию функции и не должен), казалось бы всё хорошо, бежим на главную страницу, обновляем и видим какие-то странные дела, название не изменилось, хоть и должно было подгрузиться новое из БД

 

3. Запуск через $dle_api

Ну всё хватит, повозились с движком и пошли читать документацию. Находим в документации API и как раз нужная для нас функция "clean_cache()". Пишем небольшой php скрипт в папке engine (или где угодно по сути)
 

<?
define ( 'DATALIFEENGINE', true );
define ( 'ROOT_DIR', dirname(dirname(__FILE__)) );
define ( 'ENGINE_DIR', ROOT_DIR . '' );

include(ENGINE_DIR . '/api/api.class.php');

$dle_api->clean_cache();

var_dump('END');

Результат: видим в консоли надпись "END" скрипт отработал успешно, НО, название публикации без изменений, в том числе не удалился ни один файл из папки "engine\cache\system". Есть ощущение, что api работает(если вообще работает) только если переключить режим кеширования на "Файловый".

 

PS: Скрипты запускались через консоль командами "php file_name.php" (по умолчанию версия 8.1.9) и "/php/PHP_7.4/php.exe file_name.php" (версия 7.4.30)

PS2: В основном для тестов использовал из консоли версию 7.4, т.к. 8.1 выдавала ошибки типа "Deprecated", к примеру:

Скрытый текст

 

Deprecated: explode(): Passing null to parameter #2 ($string) of type string is deprecated in \engine\inc\include\functions.inc.php on line 24

Deprecated: ip2long(): Passing null to parameter #1 ($ip) of type string is deprecated in \engine\inc\include\functions.inc.php on line 38

Warning: Undefined array key "HTTP_HOST" in \engine\inc\include\functions.inc.php on line 38

Warning: Attempt to read property "connection" on null in \engine\inc\include\functions.inc.php on line 1127

 

PS3: Еще заметил одну и ту же функцию в двух разных файлах, с один лишь отличием, одна из них всегда возвращает true. Файл "engine\inc\include\functions.inc.php" строка 1123 функция function clear_cache($cache_areas = false) и файл "engine\modules\functions.php" строка 909 та же функция "function clear_cache($cache_areas = false)". Думается мне писать одно и то же не очень.

 

И самое важно, ради чего всё это! Пожалуйста помогите, как очистить кеш через сторонний скрипт? 

Изменено пользователем Yuki
Ссылка на сообщение
Поделиться на других сайтах

Во первых никакой cron.php удалять и чистить не нужно, вы заставляете делать DLE лишнюю тяжелую работу в дальнейшем, в которой нет необходимости.

Во вторых ключевое это:

Цитата

сайт с включенным кешированием через Memcache или Redis (это важно!),

А теперь посмотрите на ваш код вашего стороннего модуля. Где вы в нем инициализировали и подключились к использованию этих хранилищ? Нигде. Вы оперируете лишь функциями очистки кеша, но никакие хранилища кеша не заданы, соответственно они лишь оперируют с файловым кешем по умолчанию, а DLE хранит их совершенно в другом месте.

Направление я вам дал, думаю теперь вам понятно в чем проблема. Готовых модулей и решений на заказ я уже не пишу.

Ссылка на сообщение
Поделиться на других сайтах

Спасибо большое за направление )) без него бы наверное еще не скоро бы сделал, а так за часок справился ))

 Если кому-то понадобиться, то получилось что-то такое:

<?
define ( 'DATALIFEENGINE', true );
define ( 'ROOT_DIR', dirname(dirname(__FILE__)) );
define ( 'ENGINE_DIR', ROOT_DIR . '' );

include(ENGINE_DIR . '/data/config.php'); // получаю переменную $config
include_once ENGINE_DIR . '/classes/plugins.class.php'; // для DLEPlugins

switch ($config['cache_type']) {
  case '1':
    include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/memcache.class.php')); // получаю класс dle_fastcache
    a0_clear_all($config);
    break;
  case '2':
    include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/redis.class.php')); // получаю класс dle_fastcache
    a0_clear_all($config);
    break;
  
  default: // если файловый кеш
    include_once(DLEPlugins::Check(ENGINE_DIR . '/inc/include/functions.inc.php'));
    clear_all_caches(); // удаление файлов с диска
    clear_static_cache_id();
    break;
}

function a0_clear_all($config) { // очистка кеша из памяти
  $dlefastcache = new dle_fastcache($config);
  $dlefastcache->clear();
}


var_dump('END');

Из минусов такого подхода: кеш удаляется полностью вся (может для кого-то и не минус).

Ссылка на сообщение
Поделиться на других сайтах
  • 4 месяца спустя...
23.03.2023 в 13:15, Yuki сказал:

Спасибо большое за направление )) без него бы наверное еще не скоро бы сделал, а так за часок справился ))

 Если кому-то понадобиться, то получилось что-то такое:


<?
define ( 'DATALIFEENGINE', true );
define ( 'ROOT_DIR', dirname(dirname(__FILE__)) );
define ( 'ENGINE_DIR', ROOT_DIR . '' );

include(ENGINE_DIR . '/data/config.php'); // получаю переменную $config
include_once ENGINE_DIR . '/classes/plugins.class.php'; // для DLEPlugins

switch ($config['cache_type']) {
  case '1':
    include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/memcache.class.php')); // получаю класс dle_fastcache
    a0_clear_all($config);
    break;
  case '2':
    include_once (DLEPlugins::Check(ENGINE_DIR . '/classes/redis.class.php')); // получаю класс dle_fastcache
    a0_clear_all($config);
    break;
  
  default: // если файловый кеш
    include_once(DLEPlugins::Check(ENGINE_DIR . '/inc/include/functions.inc.php'));
    clear_all_caches(); // удаление файлов с диска
    clear_static_cache_id();
    break;
}

function a0_clear_all($config) { // очистка кеша из памяти
  $dlefastcache = new dle_fastcache($config);
  $dlefastcache->clear();
}


var_dump('END');

Из минусов такого подхода: кеш удаляется полностью вся (может для кого-то и не минус).

Привет! Мне надо чистить файловый кэш, подойдет данный код?

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...