/** * Returns active A/B-test * * @return array|null */ public static function getActiveTest() { static $abtest; static $defined; if (!defined('SITE_ID') || !SITE_ID) { return null; } if (empty($defined)) { $cache = new \CPHPCache(); if ($cache->initCache(30 * 24 * 3600, 'abtest_active_' . SITE_ID, '/abtest')) { $abtest = $cache->getVars(); } else { $abtest = ABTestTable::getList(array('order' => array('SORT' => 'ASC'), 'filter' => array('SITE_ID' => SITE_ID, 'ACTIVE' => 'Y', '<=START_DATE' => new Type\DateTime())))->fetch() ?: null; $cache->startDataCache(); $cache->endDataCache($abtest); } $defined = true; if (!empty($abtest)) { if (!$abtest['MIN_AMOUNT']) { $capacity = AdminHelper::getSiteCapacity($abtest['SITE_ID']); if ($capacity['min'] > 0) { $result = ABTestTable::update($abtest['ID'], array('MIN_AMOUNT' => $capacity['min'])); if ($result->isSuccess()) { $cache->clean('abtest_active_' . SITE_ID, '/abtest'); $abtest['MIN_AMOUNT'] = $capacity['min']; } } } if (intval($abtest['DURATION']) == -1) { if (intval($abtest['MIN_AMOUNT']) > 0) { $capacity = AdminHelper::getTestCapacity($abtest['ID']); if ($capacity['A'] >= $abtest['MIN_AMOUNT'] && $capacity['B'] >= $abtest['MIN_AMOUNT']) { Helper::stopTest($abtest['ID'], true); $abtest = null; } } } else { if (intval($abtest['DURATION']) > 0) { $end = clone $abtest['START_DATE']; $end->add(intval($abtest['DURATION']) . ' days'); if (time() > $end->format('U')) { Helper::stopTest($abtest['ID'], true); $abtest = null; } } } } } return $abtest; }