Битрикс, удаление ненужных модулей

Алексей,
Битрикс, удаление ненужных модулей

Если у Вас одна из старших редакций 1С-Битрикс, неизбежно будут модули и компоненты которые Вы не используете, но которые занимают место на хостинге, периодически обновляются и добавляются в бекапы, увеличивая время создания и вес архива.

Стандартно файлы модулей удалять нельзя, т.к. они входят в состав ядра, хотя веских причин для запрета удаления я не вижу. Т.ч. я тут накидал скрипт который берет удаленные (из БД) модули и складывает их файлы в один архив. Почему не удаляю совсем? Потому что в будущем какой-то модуль может понадобиться и его можно будет восстановить из этого архива.

upd: на деле удаленные модули можно повторно загрузить через обновление системы

Важно! Я настоятельно рекомендую сделать резервную копию перед выполнением.

// Помещаем в архив "удаленные" модули
$zipPath = $_SERVER["DOCUMENT_ROOT"].'/bitrix/modules/unlink-modules.zip';
if (file_exists($zipPath)) { // Удаляем файл перед созданием архива
	unlink($zipPath);
}

$zip = new ZipArchive();
$zip->open($zipPath, ZipArchive::CREATE);

foreach (array("/local/modules", "/bitrix/modules") as $folder) {
	$handle = @opendir($_SERVER["DOCUMENT_ROOT"].$folder);
	if ($handle) {
		while (false !== ($dir = readdir($handle))) {
			if (!isset($arModules[$dir]) && is_dir($_SERVER["DOCUMENT_ROOT"].$folder."/".$dir) && $dir != "." && $dir != ".." && $dir != "main" && strpos($dir, ".") === false) {
				$moduleDir = $_SERVER["DOCUMENT_ROOT"].$folder."/".$dir;
				if($info = CModule::CreateModuleObject($dir)) {
				    if (!$info->IsInstalled()) {
						$arModules[$dir]["MODULE_ID"] = $info->MODULE_ID;
						$arModules[$dir]["MODULE_NAME"] = $info->MODULE_NAME;
						$arModules[$dir]["MODULE_DIR"] = $moduleDir;

						$files = new RecursiveIteratorIterator(
							new RecursiveDirectoryIterator($moduleDir),
							RecursiveIteratorIterator::LEAVES_ONLY
						);

						foreach ($files as $name => $file) {
							if (!$file->isDir()) { // Пропускаем папки (будут добавлены автоматически)
								$filePath = $file->getRealPath();
								$relativePath = $dir.'/'.substr($filePath, strlen($moduleDir) + 1); // Путь от папки модуля
								$zip->addFile($file->getRealPath(), $relativePath); // Добавляем модуль в архив
							}
						}
					}
				}
			}
		}
		closedir($handle);
	}
}

$zip->close();

// Удаляем папку модуля
foreach ($arModules as $arModule) {
    if ($arModule["MODULE_DIR"]) {
		$iterator = new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator($arModule["MODULE_DIR"]),
			RecursiveIteratorIterator::CHILD_FIRST
		);

		foreach ($iterator as $path) {
			if ($path->isDir()) {
				rmdir((string)$path);
			} else {
				unlink((string)$path);
			}
		}
		rmdir($arModule["MODULE_DIR"]);
	}
}

Результаты:

  • Кол-во файлов на сайте уменьшилось с 78к до 48к
  • Общий размер файлов уменьшился с 3.13Гб до 2.93Гб
  • Размер бекапа уменьшился с 366Мб до 259Мб
  • Ошибок нет, система работает стабильно

Вывод: нужно удалять неиспользуемые компоненты, но в другой раз :)

Опубликовано 25 Сентября 2019 | Обновлено 9 Октября 2019
чистка, готовый код

Возврат к списку

Комментарии
Алексей
Алексей
8 Окт 2019
Удалил и компоненты тоже :) Статья про удаление