Как сделать чтобы проект удалил папку с самим собой и на её место скопировал другую папку?
Столкнулся с задачей, которую пока не удалось решить. Нужно чтобы проект на бэкэнде запустил php скрипт, который бы извлёк из переданного с фронтэнда архива все файлы, положил их во временную папку операционной системы, потом удалил бы содержимое всей папки бэкэнда и потом на ее место скопировал бы содержимое из временной папки разархивированного проекта (восстановление из бепака).
Конечно же пытался вызвать команду shell linux rm -rf /home/user/project/{*,.*}
Но это не работает, потому что скрипт не может удалить папку, в которой сам находится.
Если запустить эту команду просто из консоли, то содержимое папки удаляется.
Но как это организовать всё?
Пока мысль только такая:
1) - при получении с фронтэнда данных по нужному роуту скопировать из проекта заранее подготовленный php скрипт во временную папку операционной системы и передать в него параметры - архив, который надо загрузить распаковать и путь к проекту, который надо удалить.
2)как только скрипт распаковал бекап нужно заставить этот скрипт выполнить команду rm -rf ... rm -rf /home/user/project/{*,.*}
чтобы он удалил содержимое папки проекта и опят же при помощи вызова команды linux переместить содержимое бекапа в папку проекта.
Но сработает ли это или есть еще какой-нибудь выход?
VoidVolker, папки. При этом не просто папки. backend вместе со скриптом находится в папке
/home/user/project/api
а фронтэнд находится в папке
/home/user/project/
и нужно чтобы содержимое папки project полностью очистилось и на ее место скопировалось содержимое другой папки.
Все получается сделать кроме удаления самого себя.
А про завершение процесса родителя - я просто не понял. Если мы вызвали bash скрипт, то он ведь должен выполниться прежде, чем вернуть управление в вызывающий его скрипт.
Зачем вы вызываете rm из кода? когда в php есть свои методы?
Удалить файл, из которого php запущен нет никаких проблем, в т.ч. в текущем каталоге вместе с ним самим.
test.php
<?php
unlink('test.php');
rmdir(getcwd());
?>
Ищите не закрытые файлы в своем коде.
p.s. вы рекурсивно удалять файлы не можете код написать?
// внимание, код нужно дорабатывать до универсальности
function rrmdir($dir) {
foreach(glob($dir.'/*') as $f) {
is_dir($f) ? rrmdir($f) : unlink($f);
}
rmdir($dir);
}
ну дак это же костыль средствами php удалять рекурсивно папки, если можно одной командой операционной системы всё это удалить. Там знаете сколько файлов? Одна папка vendor только чего стоит .а тут команда rm сработает за долю секунды.
Слава, не спорю, но вы не знаете что по пути не удалилось, как раз встретили ситуацию, когда использование не подконтрольного внешнего инструмента (с плохими логами), не дает вам информации о произошедшем.. почему не удаляется, что не удаляется и т.п.
p.s. кажется это тот случай рекурсивный код удаления файлов на php работает так же быстро как rm -rf, потому что ничего не делает и не проверяет, но добавление проверок на ошибки так же не замедлит его
я бы немного изменил Ваше решение:
1) PHP скрипт загружает архив во временную папку и распаковывает там.
2) по окончанию распаковки скрипт текущую папку переименовывает, например, в project_old , а временную папку помещает по пути /home/user/project
3) затем можно запустить шелл скрипт, который удалит /home/user/project_old
Может быть проблема, если что-то держит открытый файловый дескриптор на /home/user/project
Тогда можно так:
1) первый шаг оставляем без измнений
2) во временной папке запускаем шелл скрипт, который очистит /home/user/project и перекидает туда всё из временной папки
3) затем из основной папки запускаем скрипт ( хоть шелл, хоть php-шный), который удалит временную папку.