Как настроить проект так, чтобы он удалял свою собственную папку и заменял её другой папкой?

Я сталкиваюсь с задачей, которую пока не удается решить. Мне нужно, чтобы проект на бэкэнде запустил PHP скрипт, который выполнит следующие действия: извлечет файлы из архива, переданного с фронтэнда, поместит их во временную папку операционной системы, затем удалит все файлы в папке бэкэнда и после этого скопирует содержимое временной папки (разархивированного проекта) обратно в папку проекта (восстановление из бэкапа).

Я пытался использовать команду shell в Linux: 
<code>rm -rf /home/user/project/{*,.*}</code> 
Однако она не работает, поскольку скрипт не имеет права удалять папку, в которой он находится. Когда я запускаю эту команду в консоли, содержимое папки удаляется без проблем.

Как мне организовать процесс выполнения этих задач? 

На данный момент у меня есть следующая идея:
1) При получении данных с фронтэнда по определенному роуту скопировать заранее подготовленный PHP скрипт во временную папку операционной системы и передать в него параметры: архив, который нужно распаковать, и путь к папке проекта, содержимое которой нужно удалить.
2) После того как скрипт распакует бэкап, заставить его выполнить команду <code>rm -rf /home/user/project/{*,.*}</code>, чтобы удалить содержимое папки проекта, а затем переместить содержимое бэкапа в папку проекта с помощью вызова команды Linux.

Подойдет ли такой способ или существуют другие альтернативные решения?
  • 22 января 2025 г. 21:14
Ответы на вопрос 2
Ваше решение имеет несколько важных моментов, которые нужно учесть, чтобы выполнить задуманное безопасно и эффективно. Я немного расширю вашу идею и добавлю рекомендации, чтобы вы могли реализовать свою задачу.

### Основные шаги для реализации

1. **Создание временной папки**:
   - При получении запроса с фронтэнда создайте временную папку для разархивации. Вы можете использовать функцию `sys_get_temp_dir()` для получения системной временной директории.

2. **Загрузка и разархивация файла**:
   - Получите архив из запроса и сохраните его во временной папке.
   - Используйте функции PHP для работы с архивами (например, `ZipArchive`) для разархивации содержимого в созданную временную папку.

3. **Удаление содержимого папки проекта**:
   - Поскольку вы не можете удалить папку, в которой выполняется скрипт, вместо этого можно удалить только содержимое папки. Используйте функцию `scandir()` для получения списка файлов и папок, а затем для их удаления. Пример:

   ```php
   $projectDir = '/home/user/project/';
   $files = array_diff(scandir($projectDir), array('.', '..'));
   foreach ($files as $file) {
       $filePath = "$projectDir/$file";
       if (is_dir($filePath)) {
           rmdir($filePath); // Удалить директорию (должна быть пустой)
       } else {
           unlink($filePath); // Удалить файл
       }
   }
   ```

4. **Копирование содержимого временной папки в проект**:
   - После удаления файлов скопируйте содержимое временной директории в папку проекта. Вы можете использовать функцию `copy()` или `rename()` если хотите переместить папку, или `recursive` алгоритм для копирования всех файлов и папок.

5. **Очистка временной папки**:
   - После завершения всех действий удалите временную папку и её содержимое.

### Альтернативный подход

Для более сложных операций, таких как изменение структуры проекта или обновление библиотек, можно рассмотреть использование инструментов управления версиями, таких как Git. Это позволит управлять различными версиями кода и rollback, если что-то пойдёт не так.

### Безопасность

Учтите следующие моменты:
- **Права доступа**: Убедитесь, что PHP имеет соответствующие права на чтение и запись в папки, которые вы используете. Установите правильные разрешения на папки.
- **Защита от вредоносного кода**: Всегда проверяйте файлы, получаемые с фронтэнда, чтобы избежать выполнения потенциально вредоносного кода.
- **Ограничение размера загружаемого файла**: Установите ограничение на размер загружаемого архива, чтобы предотвратить атаки с помощью слишком больших файлов.

Надеюсь, эта информация поможет вам успешно выполнить вашу задачу!
Зачем вы вызываете rm из кода? когда в php есть свои методы? <br/> <br/> Удалить файл, из которого php запущен нет никаких проблем, в т.ч. в текущем каталоге вместе с ним самим. <br/> test.php <br/> <pre><code class="php">&lt;?php
unlink('test.php');
rmdir(getcwd());
?&gt;</code></pre> <br/> Ищите не закрытые файлы в своем коде. <br/> <br/>
Похожие вопросы