Разрослась до огромных размеров БД. Системе около 5 лет. Кастомным макросом удалил ненужные заказы - уменьшилась в 2 раза. Но все равно больше гига. В справочнике "Незарегистрированный пользователь" около 3 млн записей. Записи типа ip и данные пользователей. Как этот справочник почистить?
// Сначала ищем и сохраняем в массиве все id покупателей, которые нельзя удалять.
$objectTypes = umiObjectTypesCollection::getInstance();
$ObjectTypeId = $objectTypes->getBaseType("emarket", "order");
$sel_order = new umiSelection;
$sel_order->addObjectType($ObjectTypeId);
$sel_order->addPropertyFilterIsNotNull($num_order);
$result_order = umiSelectionsParser::runSelection($sel_order); //Массив id объектов
$arr_need_users = array();
foreach($result_order as $Id) {
$object = $objects->getObject($Id);
$need_user_id = $object->getValue("customer_id");
$arr_need_users[] = $need_user_id;
}
// затем тупо делаем выборку из базы всех покупателей и удаляем только тех,
// которых нет в ранее сохранённом массиве нужных покупателей.
$cnt = 1000;
$sel_guest = new selector('objects');
$sel_guest->types('object-type')->name('emarket', 'customer');
$sel_guest->limit(0, $cnt);
$sel_guest->order('id')->desc();
$result_guest = $sel_guest->result();
$deleted=0;
foreach($result_guest as $item){
$id_customer = $item->id;
if(!in_array($id_customer, $arr_need_users)) {
$objects->delObject($id_customer);
//$sql_del = "DELETE FROM `cms3_object_content` WHERE `obj_id` = {$id_customer}";
//l_mysql_query($sql_del);
$deleted++;
}
}
нешел вот этот пример, но он не работает. ничего не удаляет. перепробывал уже всякие варианты - delObject($id_customer) почемуто не работает.
public function getGuideList($id){
$cnt = 1000;
$sel_guest = new selector('objects');
$sel_guest->types('object-type')->name('emarket', 'customer');
$sel_guest->limit(0, $cnt);
$sel_guest->order('id')->desc();
$result_guest = $sel_guest->result();
$id=13145895; // реальный пользователь, выбран с админ справочник "Незарег. покупатели"
$objects->delObject($id);
echo 'ok';
}
Ну понятно. А $objects - это кто?
Судя по всему тут слегка не хватает строки
$objects = umiObjectsCollection::getInstance();
Наконец то разобрались, благодаря aghigay. думаю это многим будет полезно если такого мусора много. поэтому от себя еще добавлю - в конец скрипта еще допишите
echo "<html><head><script>
onload = function () {setTimeout ('location.reload (true)', 2000)}
</script></head><body>".($deleted)."</body></html>";
и можно пойти покурить.
ну и в конце еще нужно оптимизировать всю БД.