Почему быстро растёт база данных

     Примеры приведены для версии юми 2.8.6.1 от 2013-го года.

    Частенько у сайтов на юми замечаю такой неприятный глюк, как очень быстрый рост размера базы данных без каких-либо видимых причин. Т.е. ни количество товара, ничего особо на сайт на добавляется, а база как на дрожжах растёт.

    Основной причиной такого роста как правило оказывается сканирование сайта поисковыми ботами. Эти нехорошие боты когда проходят по сайту они не хранят ни куки, ни сессии, и потому сайт для каждого захода бота заводит нового покупателя и формирует для него пустую корзину.

    Происходит это в файле: \classes\modules\emarket\classes\customer\customer.php

     

    Выход из данной ситуации в принципе придумать достаточно просто, можно, к примеру, сделать бот-детектор по значению  'HTTP_USER_AGENT', и для таких случаев на одного бота достаточно заводить одного "Незарегистрированного покупателя" для каждого уникального IP. 

    Т.е. если гугл бот сканит сайт с 5-ти ip адресов, то как раз 5 покупателей и создастся, а не 10 000 как было до этого.

    Вставочку проверки нужно вставить в функцию createGuestCustomer:

     

     

    Полный пример ниже:

    		protected static function createGuestCustomer() {
    			$objectTypes = umiObjectTypesCollection::getInstance();
    			$objects = umiObjectsCollection::getInstance();
    			$objectTypeId = $objectTypes->getBaseType('emarket', 'customer');
    
    			$isbot = self::isBot(getServer('HTTP_USER_AGENT'));
    			if ($isbot) {
    				$sel = new selector('objects');
    				//$sel->types('object-type')->name('emarket', 'customer');
    				$sel->types('object-type')->id($objectTypeId);
    				//$sel->where('name')->equals('127.0.0.1');
    				$sel->where('name')->equals(getServer('REMOTE_ADDR'));
    				$sel->order('id')->desc();
    
    				$object = $sel->first;
    				//echo ' ' . $sel->first->id;
    				if ($object instanceof iUmiObject) {
    					return $object->getId();
    				}
    
    			}
    
    			return $objects->addObject(getServer('REMOTE_ADDR'), $objectTypeId);
    		}
    
    		protected static function isBot ($ua) {
    
    			$engines = array(
    				array('Aport', 'Aport'),
    				array('Google', 'Google'),
    				array('msnbot', 'MSN'),
    				array('Rambler', 'Rambler'),
    				array('Yahoo', 'Yahoo'),
    				array('Yandex', 'Yandex'),
    				array('Aport', 'Aport robot'),
    				array('Bing', 'Bing'),
    				array('msnbot', 'MSN'),
    				array('Rambler', 'Rambler'),
    				array('Yahoo', 'Yahoo'),
    				array('AbachoBOT', 'AbachoBOT'),
    				array('accoona', 'Accoona'),
    				array('AcoiRobot', 'AcoiRobot'),
    				array('ASPSeek', 'ASPSeek'),
    				array('CrocCrawler', 'CrocCrawler'),
    				array('Dumbot', 'Dumbot'),
    				array('FAST-WebCrawler', 'FAST-WebCrawler'),
    				array('GeonaBot', 'GeonaBot'),
    				array('Gigabot', 'Gigabot'),
    				array('Lycos', 'Lycos spider'),
    				array('MSRBOT', 'MSRBOT'),
    				array('Scooter', 'Altavista robot'),
    				array('AltaVista', 'Altavista robot'),
    				array('WebAlta', 'WebAlta'),
    				array('IDBot', 'ID-Search Bot'),
    				array('eStyle', 'eStyle Bot'),
    				array('Mail.Ru', 'Mail.Ru Bot'),
    				array('Scrubby', 'Scrubby robot'),
    				array('Yandex', 'Yandex'),
    				array('Dot', 'Dot'),
    				array('MJ12', 'MJ12'),
    				array('Ahrefs', 'Ahrefs'),
    				array('Semrush', 'Semrush')
    			);
    
    			foreach ($engines as $engine) {
    				if (stristr($ua, $engine[0])) {
    					return $engine[1];
    				}
    			}
    			return false;
    		}