Где запрашивать базу данных в модуле


Я создаю модуль, который в основном представляет собой форму, но должен использовать информацию из таблицы в базе данных, чтобы реагировать на некоторые нажатия кнопок. Вместо выполнения запроса к базе данных при каждом нажатии кнопки в функции callback, есть ли способ извлечь всю информацию из базы данных при загрузке модуля и сохранить ее в переменной, чтобы другие функции в модуле могли использовать/получать к ней доступ?

Спасибо в продвижение

Код: Пример модуля, похожего на мой текущий. Мне нужно использовать результаты запроса базы данных в функции copy_text, и по мере создания формы я получаю те же результаты в обратных вызовах для других функций, поэтому я не вижу смысла помещать один и тот же db_query в каждый обратный вызов - конечно, это просто ненужный запрос базы данных:

<?php


function playground_menu() {
  $items['playground/form'] = array(
    'title' => 'Form',
    'description' => '',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('playground_demo_form'),
    'access arguments' => array('access content'),
  );
  return $items;
}

function playground_demo_form($form, $form_state) {

  $form['input'] = array(
    '#type' => 'textarea',
    '#title' => t('Input text'),
    '#prefix' => '<div id="in-text">',
    '#attributes' => array(
      'placeholder' => t('Enter some text here... '),
    ),
    '#suffix' => '</div>',
  );

  $form['buttons'] = array(
    '#type' => 'fieldset',
    '#title_display' => 'invisible',
    '#attributes' => array(
      'style' => 'border: 0px; text-align: right',
      'class' => array('container-inline'),
    ),
  );

  $form['buttons']['copy'] = array(
    '#type' => 'button',
    '#value' => 'Copy text',
    '#ajax' => array(
      'callback' => 'copy_text',
      'wrapper' => 'out-text',
//          'method' => 'replace',
//          'effect' => 'fade',
    ),
  );

  $form['buttons']['reverse'] = array(
    '#type' => 'button',
    '#value' => t('Reverse text'),
  );

  $form['buttons']['clear'] = array(
    '#type' => 'button',
    '#value' => t('Clear text'),
  );

  $form['output'] = array(
    '#type' => 'textarea',
    '#title' => t('Output text:'),
    '#prefix' => '<div id="out-text">',
    '#value' => '',
    '#attributes' => array(
      'placeholder' => t('Your text will appear here...'),
    ),
    '#suffix' => '</div>',
  );

  return $form;
}

function copy_text($form, $form_state){
  $form['output']['#value'] = $form_state['values']['input'];
  return $form['output'];
}
 3
Author: kiamlaluno, 2014-08-04

2 answers

Вы могли бы просто обернуть свой запрос в тест кэша, вот так:

function steam_get_username2($steam64)  {
  if($cached = cache_get('steam'.$steam64, 'cache'))  {
    $username = $cached->data;
  }
  if(empty($username)) {
    $username = 'blank'; // Expensive code here
    cache_set('steam'.$steam64, $username, 'cache', 60*60); //1 hour
  }
  return $username;
}

Пример аландарева о Drupal.org , немного подправленный мной.

Пожалуйста, помните, что HTTP является протоколом без сохранения состояния, поэтому каждый раз, когда вызывается обратный вызов, это новое выполнение с новыми переменными. Вот почему Drupal не может кэшировать память самостоятельно. Итак, Drupal кэширует в базе данных. Если ваш запрос не очень сложный, кэширование имеет мало смысла - оно только заменяет один запрос другим. Ты должен используйте APC или Memcached, чтобы действительно почувствовать разницу, так как они позволяют быстро кэшировать в оперативной памяти.


Если вам нужны одни и те же данные в нескольких местах во время одного вызова, например, функция построения форм, валидаторы и функция обратного вызова, используйте статический кэш. &drupal_static($name, $default_value = NULL, $reset = FALSE) это то, что вам нужно в таких ситуациях. Традиционный способ - использовать его как

$function_static_data = &drupal_static(__FUNCTION__);

Это позволит убедиться, что статические данные правильно связаны с функцией, которая их использует, освобождая вас от бремени столкновений предотвращение (так как имена функций уже уникальны в PHP).

 2
Author: Mołot, 2014-08-04 14:14:30

У вас есть два варианта, в зависимости от ваших потребностей

  1. Статический кэш - данные создаются один раз во время одного запроса и повторно используются при необходимости. Ваш запрос будет выполняться один раз, но только один раз для каждого связанного запроса. Видишь drupal_static() например, обычаи.
  2. Внутренний кэш - результаты запроса к базе данных кэшируются, и вы запрашиваете данные в ячейках кэша вместо таблицы базы данных. Ваш запрос будет выполняться только один раз, пока кэш не станет недействительным, когда он будет очевидно, что его нужно запустить снова. Вы все равно понесете накладные расходы на запрос кэша, поэтому, если ваш кэш основан на базе данных, это может стоить или не стоить того, в зависимости от размера и сложности ваших данных. С помощью этого метода вам также нужно будет подумать о том, как/когда/если вы аннулируете кэш, чтобы получить свежие данные. Увидеть Cache API docs для примера.
 2
Author: Clive, 2014-08-04 11:47:31