[РЕШЕНО] Увеличивается sqlite база при каждой очистке кэша

Главные вкладки

Аватар пользователя PbI6A_KuT PbI6A_KuT 30 ноября 2013 в 22:04

Установил drupal commerce, Ajax Basket Link, Commerce Cart Ajax, Commerce Robokassa. Видимо после этого стала расти база данных sqlite с каждым нажатием кнопки "очистить кэш". Из 12Мб выросла до 2Гб. Подскажите что делать.

Нашел команду VACUUM для sqlite. В итоге база уменьшилась до 127Мб, потом мигрировал на mysql и обратно, стала снова 12Мб.

Комментарии

Аватар пользователя whiesam whiesam 30 ноября 2013 в 23:41

По теме - ХЗ, мб дело в том что это не mySQL а лайт.
Модуль Boost, он сохраняет кеш на локальном носителе (хостинге), только при включении буста не забудь отключить стандартный кеш дру.

Аватар пользователя PbI6A_KuT PbI6A_KuT 1 декабря 2013 в 12:46

sqlite использую потому что есть много мелких сайтов, и смысла ставить под каждый mysql не вижу. + хорошая экономия на хостинге.

синонимы не использую.

проблема с cache_form известная в интернетах, но те способы что предлагают почему то не работают с sqlite. таблица не очищается с помощью db_query("DELETE FROM cache_form where 'expire' < UNIX_TIMESTAMP();");"

хотя может она и очищается, только я не знаю как запустить команду VACUUM с помощью drupal к базе данных после очистки таблицы cache_form.

нашел модуль sqlite vacuum, но там даже админка не работает от чего то.

Аватар пользователя PbI6A_KuT PbI6A_KuT 1 декабря 2013 в 13:04

В общем вроде да, таблица очищается вот таким кодом в модуле:

<?php

function clearcacheform_cron() {
cache_clear_all('*', 'cache', TRUE);
cache_clear_all('*', 'cache_form', TRUE);
}
?>

Но вот команду VACUUM как запустить таким же способом я не знаю. Есть документация по данному запросу к базе: http://www.sqlite.org/lang_vacuum.html может кто разбирается? А то я совсем не шарю.

Аватар пользователя deb deb 1 декабря 2013 в 13:05

"PbI6A_KuT" wrote:

95% всего объема базы занимается таблица caсhe_form. в чем может быть причина?

В рукожопости погроммистов.

Аватар пользователя PbI6A_KuT PbI6A_KuT 1 декабря 2013 в 13:06

Вскрыл модуль SQLite Vacuum:

<?php

/**
* Vacuum.
*
* @return Exception|null
*/
function sqlite_vacuum() {
// If our friend SQLite booster brought us a transaction, end it.
$transaction = &drupal_static('sqlite_booster');
$transaction = NULL;
try {
db_query('vacuum;');
} catch (Exception $e) {
return $e;
}
return NULL;
}

/**
* Check for SQLite DB.
*/
function sqlite_vacuum_check() {
$dbh = Database::getConnection();
return $dbh->databaseType() === 'sqlite';
}

/**
* Implements hook_cron().
*/
function sqlite_vacuum_cron() {
if (!sqlite_vacuum_check()) {
return;
}
// Interval defaults to 10800s = 3h.
$interval = sqlite_vacuum_interval();
// Set interval to 0 to disable.
if ($interval <= 0) {
return;
}
$lastrun = variable_get('sqlite_vacuum_lastrun', 0);
if (REQUEST_TIME - $lastrun >= $interval) {
$exception = sqlite_vacuum();
list($message, $placeholders) = sqlite_vacuum_message($exception);
watchdog('sqlite_vacuum', $message, $placeholders);
variable_set('sqlite_vacuum_lastrun', REQUEST_TIME);
}
}

/**
* @return null
*/
function sqlite_vacuum_interval() {
return variable_get('sqlite_vacuum_interval', 10800);
}

/**
* Implements hook_permission().
*/
function sqlite_vacuum_permission() {
return array(
'administer sqlite vacuum' => array(
'title' => t('Administer SQLite Vacuum'),
),
);
}

/**
* Implements hook_menu().
*/
function sqlite_vacuum_menu() {
$items['admin/config/development/sqlite-vacuum'] = array(
'title' => t('SQLite Vacuum'),
'page callback' => 'drupal_get_form',
'page arguments' => array('sqlite_vacuum_form'),
'access arguments' => array('administer sqlite vacuum')
);
return $items;
}

/**
* @param $exception
* @return null|string
*/
function sqlite_vacuum_message($exception) {
if (!$exception) {
return array('SQLite DB vacuumed.', array());
}
else {
return array('DB Exception: %e', array('%e' => (string) $exception));
}
}

/**
* Form callback.
*/
function sqlite_vacuum_form($form_state) {
$is_sqlite = sqlite_vacuum_check();
$status = $is_sqlite ? t('SQLite DB driver detected.') : t('Currently no SQLite DB driver.');

$form = array();
$form[] = array('#markup' => $status . '
');
$form['vacuum'] = array(
'#type' => 'submit',
'#value' => t('Vacuum now'),
'#access' => $is_sqlite,
'#submit' => array('sqlite_vacuum_button')
);
return variable_group_form($form, $form_state, 'sqlite_vacuum');
}

/**
* Form submit callback for vacuum button.
*/
function sqlite_vacuum_button(&$form, $form_state) {
$exception = sqlite_vacuum();
list($message, $placeholders) = sqlite_vacuum_message($exception);
drupal_set_message(t($message, $placeholders));
}
?>

Что отсюда мне нужно взять себе в модуль?

Аватар пользователя PbI6A_KuT PbI6A_KuT 3 декабря 2013 в 19:35

В общем видимо все разрешилось. Кэш чистит отдельный модуль с кодом

<?php

function clearcacheform_cron() {
cache_clear_all('*', 'cache', TRUE);
cache_clear_all('*', 'cache_form', TRUE);
}
?>

VACUUM выполняет модуль SQLite Vacuum. Будем считать что решено.