Задать вопрос
besogonskiy
@besogonskiy
работаю php laravel разработчиком.

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

Столкнулся с задачей, которую пока не удалось решить. Нужно чтобы проект на бэкэнде запустил php скрипт, который бы извлёк из переданного с фронтэнда архива все файлы, положил их во временную папку операционной системы, потом удалил бы содержимое всей папки бэкэнда и потом на ее место скопировал бы содержимое из временной папки разархивированного проекта (восстановление из бепака).

Конечно же пытался вызвать команду shell linux
rm -rf /home/user/project/{*,.*}
Но это не работает, потому что скрипт не может удалить папку, в которой сам находится.

Если запустить эту команду просто из консоли, то содержимое папки удаляется.

Но как это организовать всё?

Пока мысль только такая:

1) - при получении с фронтэнда данных по нужному роуту скопировать из проекта заранее подготовленный php скрипт во временную папку операционной системы и передать в него параметры - архив, который надо загрузить распаковать и путь к проекту, который надо удалить.
2)как только скрипт распаковал бекап нужно заставить этот скрипт выполнить команду
rm -rf ... rm -rf /home/user/project/{*,.*}

чтобы он удалил содержимое папки проекта и опят же при помощи вызова команды linux переместить содержимое бекапа в папку проекта.

Но сработает ли это или есть еще какой-нибудь выход?
  • Вопрос задан
  • 139 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
  1. Разместить код замены файлов в sh скрипте с ожиданием завершения процесса-родителя
  2. В вашем коде вызвать этот скрипт и завершить свою работу
Ответ написан
@rPman
Зачем вы вызываете 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);
}
Ответ написан
я бы немного изменил Ваше решение:
1) PHP скрипт загружает архив во временную папку и распаковывает там.
2) по окончанию распаковки скрипт текущую папку переименовывает, например, в project_old , а временную папку помещает по пути /home/user/project
3) затем можно запустить шелл скрипт, который удалит /home/user/project_old

Может быть проблема, если что-то держит открытый файловый дескриптор на /home/user/project
Тогда можно так:
1) первый шаг оставляем без измнений
2) во временной папке запускаем шелл скрипт, который очистит /home/user/project и перекидает туда всё из временной папки
3) затем из основной папки запускаем скрипт ( хоть шелл, хоть php-шный), который удалит временную папку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы