110 lines
3.9 KiB
PHP
110 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* Piwik - free/libre analytics platform
|
|
*
|
|
* @link http://piwik.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*
|
|
*/
|
|
namespace Piwik\Plugins\Diagnostics\Diagnostic;
|
|
|
|
use Piwik\ArchiveProcessor\Rules;
|
|
use Piwik\Config;
|
|
use Piwik\CronArchive;
|
|
use Piwik\Date;
|
|
use Piwik\Metrics\Formatter;
|
|
use Piwik\Option;
|
|
use Piwik\Plugins\Intl\DateTimeFormatProvider;
|
|
use Piwik\SettingsPiwik;
|
|
use Piwik\Translation\Translator;
|
|
|
|
/**
|
|
* Check if cron archiving has run in the last 24-48 hrs.
|
|
*/
|
|
class CronArchivingLastRunCheck implements Diagnostic
|
|
{
|
|
const SECONDS_IN_DAY = 86400;
|
|
|
|
/**
|
|
* @var Translator
|
|
*/
|
|
private $translator;
|
|
|
|
public function __construct(Translator $translator)
|
|
{
|
|
$this->translator = $translator;
|
|
}
|
|
|
|
public function execute()
|
|
{
|
|
if (!SettingsPiwik::isMatomoInstalled()) {
|
|
return [];
|
|
}
|
|
|
|
$label = $this->translator->translate('Diagnostics_CronArchivingLastRunCheck');
|
|
$commandToRerun = '<code>' . $this->getArchivingCommand() . '</code>';
|
|
$coreArchiveShort = '<code>core:archive</code>';
|
|
$mailto = '<code>MAILTO</code>';
|
|
|
|
// check cron archiving has been enabled
|
|
$isBrowserTriggerDisabled = !Rules::isBrowserTriggerEnabled();
|
|
if (!$isBrowserTriggerDisabled) {
|
|
$comment = $this->translator->translate('Diagnostics_BrowserTriggeredArchivingEnabled', [
|
|
'<a href="https://matomo.org/docs/setup-auto-archiving/" target="_blank" rel="noreferrer noopener">', '</a>']);
|
|
return [DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment)];
|
|
}
|
|
|
|
// check archiving has been run
|
|
$lastRunTime = (int)Option::get(CronArchive::OPTION_ARCHIVING_FINISHED_TS);
|
|
if (empty($lastRunTime)) {
|
|
$comment = $this->translator->translate('Diagnostics_CronArchivingHasNotRun')
|
|
. '<br/><br/>' . $this->translator->translate('Diagnostics_CronArchivingRunDetails', [$coreArchiveShort, $mailto, $commandToRerun]);;
|
|
return [DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_ERROR, $comment)];
|
|
}
|
|
|
|
$lastRunTimePretty = Date::factory($lastRunTime)->getLocalized(DateTimeFormatProvider::DATETIME_FORMAT_LONG);
|
|
|
|
$diffTime = self::getTimeSinceLastSuccessfulRun($lastRunTime);
|
|
|
|
$formatter = new Formatter();
|
|
$diffTimePretty = $formatter->getPrettyTimeFromSeconds($diffTime);
|
|
|
|
$errorComment = $this->translator->translate('Diagnostics_CronArchivingHasNotRunInAWhile', [$lastRunTimePretty, $diffTimePretty])
|
|
. '<br/><br/>' . $this->translator->translate('Diagnostics_CronArchivingRunDetails', [$coreArchiveShort, $mailto, $commandToRerun]);
|
|
|
|
// check archiving has been run recently
|
|
if ($diffTime > self::SECONDS_IN_DAY * 2) {
|
|
$result = DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_ERROR, $errorComment);
|
|
} else if ($diffTime > self::SECONDS_IN_DAY) {
|
|
$result = DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $errorComment);
|
|
} else {
|
|
$comment = $this->translator->translate('Diagnostics_CronArchivingRanSuccessfullyXAgo', $diffTimePretty);
|
|
$result = DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, $comment);
|
|
}
|
|
|
|
return [$result];
|
|
}
|
|
|
|
private function getArchivingCommand()
|
|
{
|
|
$domain = Config::getHostname();
|
|
return PIWIK_INCLUDE_PATH . ' --matomo-domain=' . $domain . ' core:archive';
|
|
}
|
|
|
|
public static function getTimeSinceLastSuccessfulRun($lastRunTime = null)
|
|
{
|
|
if (empty($lastRunTime)) {
|
|
$lastRunTime = (int)Option::get(CronArchive::OPTION_ARCHIVING_FINISHED_TS);
|
|
}
|
|
|
|
if (empty($lastRunTime)) {
|
|
return null;
|
|
}
|
|
|
|
$now = Date::now()->getTimestamp();
|
|
$diffTime = $now - $lastRunTime;
|
|
|
|
return $diffTime;
|
|
}
|
|
}
|