Запрос к БД без кэша

Аватар пользователя Artalek Artalek 22 октября в 9:54

Здравствуйте, есть не большая проблема.
При отправке формы, я обновляю поле в таблице на новое значение, но при обновление страницы, он получается старое значение, и только после сброса кэша, он получает новое значение.

Как при обращение к БД не использовать кэш?

Обращение к БД:

<?php
        $connection 
Database::getConnection();
        
$result null;
        try {
            
$query $connection->select('ms_table''msu');
            
$query->fields('msu', ['type']);
            
$query->condition('id'22);
            
$result $query->execute()->fetchObject();
        } catch (
Exception $e) {
            
drupal_set_message($e->getMessage(), 'error');
        }
?>

Лучший ответ

Аватар пользователя voviko voviko 27 октября в 11:14
1

а если так?

<?phpmymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'?>

Комментарии

Аватар пользователя vlucas vlucas 22 октября в 9:58

В таких случаях лучше не использовать прямые запросы к БД.
Пользуйтесь хранилищем сущностей и entityQuery()

Аватар пользователя Artalek Artalek 22 октября в 11:07

Через поисковик. Почему все время пытаетесь подколоть человека, который не смог найти нужную информацию? Я смог найти только статью где хорошо рассказали про прямые запросы к БД, поэтому им и воспользовался.

Аватар пользователя vlucas vlucas 22 октября в 11:10

Я ещё никого не подкалывал!!!
А почему вы думаете, что кто-то должен за вас правильно поискать?
Хоть бы спасибо сказали вообще что вам кто-то ответил!
Вам так-то никто не обязан ничем.
А спросил я потому что на эту тему информации просто вагон и всё гуглится элементарно.

Какой запрос написали в поисковик?

Аватар пользователя Artalek Artalek 22 октября в 11:51

Ваш вопрос ввел к этому.
Я не сказал, что я не благодарен Вам за подсказку в данной проблеме.
Как только я бы нашел нужную информацию, я бы Вас поблагодарил.
Как я понимаю форум для этого и создан, чтобы люди помогали друг другу.
И нет я не прошу и не хочу, чтобы люди вместо меня, что-то делали.
Просто может у кого-то есть ссылка на хорошую статью про данную тему.

Аватар пользователя Punk_UnDeaD Punk_UnDeaD 22 октября в 10:07

база данных не имеет отношения к кешу
это кешируется страница
поставьте себе уже отладчик и посмотрите, если данные не обновились, то это потому что этот код не выполнялося

Аватар пользователя Grenuy Grenuy 25 октября в 21:30

Devel (module)
kint
dpm
dsm
Вот то что нужно для отладки
Скорее всего страница кэшируется(как и выше было сказано)

можно так же чистить кэш в коде
\Drupal::service('NAME.CACHE')->invalidateAll()
Где name.cache это одно из
cache.bootstrap
cache.config
cache.data
cache.default
cache.discovery
cache.entity
cache.menu
cache.render
cache.static

Как работать с кэшами, тегами и проверять их хорошо описано здесь
https://pantheon.io/docs/guides/drupal-8-advanced-page-cache

Аватар пользователя Artalek Artalek 27 октября в 10:26

Спасибо за подсказку, но что-то я не до конца понимаю.

Сначала я попробовал вот так:

<?php
public function content(Request $request) {
            \
Drupal::service('cache_tags.invalidator')->invalidateTags(['my_custom_tag']);

        

$renderable = [
            
'#theme' => 'template',
            
'#cache' => [
                
'tags' => ['my_custom_tag'],
            ],
        ];

        return 

$renderable;
    }
?>

И вроде как в некоторых случаях срабатывает, данные тут же подтягиваются.

Но сейчас опять проблема, он опять кэширует страницу, и данные не обновляются.

У меня модуль работает с Backend по Soap, и получается, что я отправляю по Soap новую информацию, и модуль должен получить новое значение, но он не получает, т.к. все кэшируется.
Попробовал так же вот это:

<?php
\Drupal::service('cache.entity')->invalidateAll();
?>

Но все равно не работает.

Аватар пользователя Grenuy Grenuy 27 октября в 10:31
1

Проверь точно ли получаешь новые данные, можно в журнал писать

\Drupal::logger('my_module')->notice($message);

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

Аватар пользователя Artalek Artalek 27 октября в 10:38

Он в журнал записал только один раз, после перезагрузки страницы больше не записывает, как будто он даже не проходится снова по коду PHP в методе content

Аватар пользователя Grenuy Grenuy 27 октября в 12:22

Думаю в этом проблема и есть, если анонимный юзер запускает обновление данных.
Обход вижу обработку данных через js
Можно получать данные через ajax страницы которая не кэшируется

Аватар пользователя voviko voviko 27 октября в 11:14
1

а если так?

<?phpmymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'?>