PHP отвязать большое количество файлов

У меня около 600 тысяч изображений в одном каталоге, и мне нужно удалить почти половину из них с помощью PHP. В одном массиве я сохранил имена файлов, которые необходимо удалить, и когда я пытаюсь пройтись по массиву и вызвать unlink($filename), сбой сервера после ~1k итераций, и я должен перезагрузить его (CentOS 7). Использование памяти PHP составляет 81 МБ, и это из-за большого массива, который я использовал, потому что он быстрее для некоторого сравнения с файлами в каталоге, не важно.

foreach($filenames as $filename){

  // Deletes file
  unlink($filename);
}

Я подумал, может, стоит попробовать exec(), но он очень медленный, а через какое-то время тоже зависает. Я также видел здесь дискуссию о том, является ли он unlink() асинхронным, но я думаю это не так.

Мне не нужны rmdir() и удаление каталогов, потому что все 600k файлов находятся в одном каталоге, а отношения между файлами и сущностями в приложении хранятся в БД.

Есть ли другая альтернатива удалению файлов из PHP или какой-нибудь совет, как заставить это работать?


person Milos R    schedule 04.06.2016    source источник
comment
Вы запускаете это из браузера? Или из командной строки? Если вы запускаете что-то, что требует много времени для выполнения, то лучше не запускать его из браузера.   -  person Mark Baker    schedule 04.06.2016
comment
Из CLI, конечно   -  person Milos R    schedule 04.06.2016
comment
Почему это должно быть сделано из PHP?   -  person Doug    schedule 04.06.2016
comment
удалить, например, 100 файлов за раз в этой команде, поставить эту команду в cron.   -  person Denis Alimov    schedule 04.06.2016
comment
Его не нужно запускать из PHP, но я предпочитаю, и если есть способ сделать это в PHP, то почему бы и нет, также у меня есть легкая связь с БД, ORM.   -  person Milos R    schedule 04.06.2016


Ответы (1)


Я нашел одно решение. Сначала запишите список всех файлов в файл to_delete.txt (по одному имени файла в строке), используя file_put_contents(). Затем запустите xargs -a to_delete.txt -d'\n' rm для удаления файлов (xarg добавляет к rm столько аргументов, сколько может, он не запускает команду rm для каждого файла).

person Milos R    schedule 08.06.2016