Удаление заказов через скрипт
Материал из Umicms
Версия от 07:15, 27 марта 2025; Bvolkov (обсуждение | вклад)
Актуально для любой версии сайта до 24 версии включительно
Если заказов накопилось слишком много, можно использовать специальный скрипт для очистки заказов. Его необходимо назвать install.php и загрузить в корневую папку сайта (там где config.ini)
После того как скрипт будет в папке необходимо перейти по адресу https://Ваш_домен/install.php
Пример работающего скрипта:
Готовый код для скрипта, самое главное замените данные базы данных, больше ничего в скрипте менять не нужно.
<?php header('Content-Encoding: none'); /* * Скрипт для удаления всех заказов с реальным выводом прогресса */ // 1. Отключаем буферизацию полностью @apache_setenv('no-gzip', 1); @ini_set('zlib.output_compression', 0); @ini_set('output_buffering', 0); @ini_set('implicit_flush', 1); ob_implicit_flush(true); ob_end_flush(); // 2. Настройки сервера ini_set('memory_limit', '512M'); set_time_limit(0); error_reporting(E_ALL); ini_set('display_errors', 1); // 3. Ручные настройки БД (ЗАМЕНИТЕ НА СВОИ!) $dbConfig = [ 'host' => 'localhost', 'user' => 'ваш_логин_mysql', 'pass' => 'ваш_пароль_mysql', 'name' => 'имя_базы_umi' ]; // 4. HTML-шапка (выводится сразу) echo <<<HTML <!DOCTYPE html> <html> <head> <title>Удаление заказов</title> <meta charset="UTF-8"> <style> body { font-family: Arial; margin: 20px; } #progress { width: 100%; background: #f0f0f0; padding: 10px; border-radius: 5px; margin: 20px 0; } #progress-bar { height: 20px; background: #4CAF50; width: 0%; border-radius: 3px; transition: width 0.3s; } #progress-text { margin-top: 5px; } #log { max-height: 300px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; margin-bottom: 20px; } .log-entry { margin: 5px 0; } #restart-btn { padding: 10px 20px; background: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } #restart-btn:hover { background: #45a049; } #restart-btn:disabled { background: #cccccc; cursor: not-allowed; } </style> </head> <body> <h2>Удаление всех заказов</h2> <div id="progress"> <div id="progress-bar"></div> <div id="progress-text">Инициализация...</div> </div> <div id="log"></div> <button id="restart-btn" onclick="location.reload()">Повторить</button> <script> function scrollLog() { var log = document.getElementById('log'); log.scrollTop = log.scrollHeight; } </script> HTML; // 5. Принудительный вывод echo str_pad('', 2048, ' '); flush(); // 6. Основной код try { // Подключение к MySQL addLog("Подключение к MySQL..."); $db = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['name']); if ($db->connect_error) { throw new Exception("MySQL: " . $db->connect_error); } addLog("Успешно подключено к MySQL"); // Подключение ядра UMI if (!file_exists('./standalone.php')) { throw new Exception("Файл standalone.php не найден"); } require_once './standalone.php'; addLog("Ядро UMI подключено"); // Авторизация session_start(); $objects = umiObjectsCollection::getInstance(); $svId = $objects->getObjectIdByGUID('system-supervisor'); $_SESSION['user_id'] = $svId; addLog("Авторизованы как супервайзер"); // Получаем тип заказа $orderType = umiObjectTypesCollection::getInstance()->getTypeByGUID('emarket-order'); if (!$orderType) { throw new Exception("Тип заказа не найден"); } addLog("Тип заказа ID: {$orderType->getId()}"); // Получаем общее количество $total = $db->query("SELECT COUNT(*) FROM cms3_objects WHERE type_id = '{$orderType->getId()}'")->fetch_row()[0]; addLog("Всего заказов: $total"); updateProgress(0, "Начало удаления..."); // Пакетное удаление $batchSize = 500; $deleted = 0; for ($offset = 0; $offset < $total; $offset += $batchSize) { $result = $db->query(" SELECT id FROM cms3_objects WHERE type_id = '{$orderType->getId()}' LIMIT $offset, $batchSize "); while ($row = $result->fetch_assoc()) { $objects->delObject($row['id']); $deleted++; // Обновляем прогресс каждые 50 заказов if ($deleted % 50 == 0) { $percent = min(100, round(($offset / $total) * 100)); updateProgress($percent, "Удалено: $deleted ($percent%)"); addLog("Удален заказ #{$row['id']}", false); } } // Очистка памяти if (function_exists('gc_collect_cycles')) gc_collect_cycles(); usleep(10000); // 0.01 сек } updateProgress(100, "Готово! Удалено: $deleted"); addLog("Операция завершена успешно", true); $db->close(); } catch (Exception $e) { addLog("ОШИБКА: " . $e->getMessage(), true); updateProgress(0, "Произошла ошибка"); } // 7. Функции вывода function addLog($message, $isError = false) { $color = $isError ? 'red' : '#666'; echo "<script> var log = document.getElementById('log'); log.innerHTML += '<div class=\"log-entry\" style=\"color: '.$color.'\">' + new Date().toLocaleTimeString() + ' - ' + ".json_encode($message)." + '</div>'; scrollLog(); </script>"; flush(); } function updateProgress($percent, $message) { echo "<script> document.getElementById('progress-bar').style.width = '".$percent."%'; document.getElementById('progress-text').innerHTML = ".json_encode($message)."; </script>"; flush(); } echo "</body></html>";