Пример #1
0
 /**
  * Берем таблицы, последний анализ, которых был ранее чем analyze_min_age секунд назад
  * или количество изменненных строк > analyze_changed_factor * кол-во строк.
  * Сначала идут по времени последнего анализа.
  * Вопрос в том, что если сработал обычный автовакуум, то в autovacuum_log статистика не поменяется,
  * т.е. не будет известно сколько строк в реальности изменилось с последнего анализа.
  * Решение: не принимать во внимание, т.е. просто соблюдаем условия выше. Может случиться "лишний" анализ, не беда.
  */
 public function analyze($db_alias, $mode = self::MODE_ANALYZE)
 {
     $cfg = $this->_config[$mode];
     $log = new log($cfg['log_file'], 'w');
     // !!! SERVER добавить (для альфы/беты).
     $DB = new DB($db_alias);
     $log->linePrefix = $this->_config['log_line_prefix'];
     $log->writeln('Получаем список таблиц');
     $last_av_col = 'COALESCE(maintenance.max(' . ($mode == self::MODE_ANALYZE ? 'pt.last_analyze, pt.last_autoanalyze, ' : '') . "pt.last_vacuum, pt.last_autovacuum), 'epoch')";
     $sql = "\n          WITH w_stat as (\n            SELECT ts.*, pt.*, ts.relid IS NULL as _is_new, {$last_av_col} as _last_av\n              FROM pg_stat_user_tables pt\n            LEFT JOIN\n              maintenance.table_stat ts\n                ON ts.relid = pt.relid\n             WHERE pt.schemaname = 'public'\n               AND pt.n_live_tup + pt.n_dead_tup > 0\n          )\n          (\n            (SELECT *, 0 as ord, 0.00 as ord2 FROM w_stat WHERE (_is_new OR _last_av + interval '?i seconds' <= now()))\n            UNION ALL\n            (SELECT *, 1, tup_factor FROM w_stat WHERE tup_factor >= ?f)\n          )\n          ORDER BY ord, ord2 DESC, _last_av\n        ";
     $tbls = $DB->rows($sql, $cfg['min_age'], $cfg['changed_factor']);
     $acnt = 0;
     $log->writeln(count($tbls) . ' таблиц');
     foreach ($tbls as $t) {
         if ($log->getTotalTime(null) >= $cfg['max_duration']) {
             $log->writeln('Время истекло.');
             break;
         }
         $DB->query(($mode == self::MODE_VACUUM ? 'VACUUM ' : 'ANALYZE') . " VERBOSE {$t['relname']}");
         $cmpls[(int) ($t['_is_new'] == 't')][] = $t['relid'];
         $log->writeln(pg_last_notice(DB::$connections[$db_alias]));
         ++$acnt;
     }
     // Обновляем статистику.
     if ($cmpls[0]) {
         $cols = $this->_mt_cols;
         unset($cols[0], $cols[1]);
         $lcols = implode(',', $cols);
         $rcols = 'pt.' . implode(', pt.', $cols);
         $sql = "UPDATE maintenance.table_stat ts SET ({$lcols}) = ({$rcols}) FROM pg_stat_user_tables pt WHERE pt.relid IN (?l) AND ts.relid = pt.relid";
         $DB->query($sql, $cmpls[0]);
     }
     if ($cmpls[1]) {
         $cols = implode(',', $this->_mt_cols);
         $sql = "INSERT INTO maintenance.table_stat ({$cols}) SELECT {$cols} FROM pg_stat_user_tables WHERE relid IN (?l)";
         $DB->query($sql, $cmpls[1]);
     }
     // Удаляем лишние таблицы, типа catalog_positions2 (создаются/удаляются автоматом)
     $DB->query('DELETE FROM maintenance.table_stat ts WHERE NOT EXISTS (SELECT 1 FROM pg_stat_user_tables WHERE relid = ts.relid)');
     $log->writeln("Обработано {$acnt} таблиц");
 }
Пример #2
0
    $log->TRACE($parser->cleanup());
}
//Очистка "мусора" создающегося при вставке в визивиг изображений и не сохранении комментария (таблицы commune_attach, file_commune и articles_comments_files, file
if (date('H') == 23) {
    //$log->TRACE( commune::removeWysiwygTrash());
    $log->TRACE(articles::removeWysiwygTrash());
}
// Каждый день первого числа формируем документ ITO за прошлый месяц
/*
if(date('j') == 1 && date('H') == 1) {
    $prevMonth = time() - 3600 * 24 * 2; // Вычитаем два дня на всякий случай
    $log->TRACE( sbr_meta::generateDocITO(array(0 => date('Y-m-01', $prevMonth), 1 => date('Y-m-t', $prevMonth)), false, 'xlsx'));
}
*/
//Очистка логов ПСКБ из базы
/*
if(date('H') == 5) {
    // $log_pskb = new log_pskb();
    // $log->TRACE( $log_pskb->clearCloneData() );
    // $log->TRACE( $log_pskb->packOldData(true) );
}
*/
//////////////////// !!! добавлять НАД этой строкой !!! ///////////////////////
$mt = new Maintenance();
if (in_array($H, array(2, 9, 21))) {
    $log->TRACE($mt->analyze('master', Maintenance::MODE_VACUUM));
} elseif (in_array($H, array(3, 6, 10, 13, 16, 19, 22))) {
    $log->TRACE($mt->analyze('master', Maintenance::MODE_ANALYZE));
}
$log->writeln('------------ END hourly    (total time: ' . $log->getTotalTime() . ') ---------------');
Пример #3
0
<?php

//TODO Файл нужен только для тестирования. Весь функционал отсюда делается в hourly.php
// Хотя проблем его вызов не принесет
ini_set('max_execution_time', 0);
ini_set('memory_limit', '512M');
require_once 'classes/config.php';
require_once 'classes/log.php';
require_once 'classes/multi_log.php';
$log = new log('hourly_freelancer/' . SERVER . '-%d%m%Y[%H].log', 'w');
$log->writeln('------------ BEGIN hourly (start time: ' . date('d.m.Y H:i:s') . ') -----');
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/smail.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php';
$mail = new smail();
//За сутки до завершения срока действия закрепления
$mail->remindFreelancerbindsProlong();
//После того, как закрепление опустилось ниже середины списка закреплений (и в списке больше одного закрепления)
$mail->remindFreelancerbindsUp();
$log->writeln('------------ END hourly_freelancer    (total time: ' . $log->getTotalTime() . ') ---------------');