PHP: Странные проблемы с shell exec ("mkdir") и shell exec ("rm-rf)
Я работаю над PHP-скриптом для автоматической распаковки и сканирования tar.gz архивы расположены на внешнем USB-накопителе, и я столкнулся с парой странных проблем. Как только скрипт находит архив, он пытается создать временный каталог на USB-накопителе для распаковки архива. Чтобы гарантировать уникальное имя временного каталога (поскольку этот скрипт может выполняться несколько раз одновременно), я называю файл, используя случайную 5-значную часть MD5 текущего времени, например итак:
$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);
Поскольку USB-накопители не смонтированы в файловой системе сервера, я не могу использовать встроенные команды управления файлами PHP (mkdir(), glob() и т. Д.), А вместо этого могу взаимодействовать с файловой системой только с помощью команд терминала, выполняемых с помощью exec() или shell_exec(). Итак, чтобы фактически создать временный каталог с указанным выше именем, я использую базовую команду mkdir терминала:
shell_exec("mkdir $temp");
Затем я извлекаю архив во временный каталог:
shell_exec("tar -xzf $archivePath -C $temp");
Наконец, после того, как я закончил анализ архива, я удаляю временный каталог и его содержимое:
shell_exec("rm -rf $temp");
Однако я столкнулся с двумя странными проблемами:
Иногда, возможно, один из каждых пяти запусков, временный каталог создается с поврежденным именем. При отображении с помощью
ls directory
он выглядит примерно как06191v??????.???v???
. Однако при использовании клавиши tab для автоматического заполнения командыcd
это заполняет гораздо более длинную строку, что-то вроде06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/
. Я знаю, что строка в порядке непосредственно перед передачей ее в shell_exec() (я даже пытался использовать substr(), чтобы ограничить ее правильной длиной, но безрезультатно), и что последовательность символов, следующих за первой косой чертой (поэтому, начиная с 342), всегда одинакова, независимо от того, каковы начальные пять символов (символ между начальными пятью и косой чертой всегда является буквой, но в остальном случайна). Кроме этого, однако я в растерянности.По какой-то причине
shell_exec("rm -rf $temp");
, который я использую для удаления временного каталога в конце сценария, работает только в том случае, если я выполняю его дважды. Если я выполню его только один раз, я получу следующую ошибку:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty
, что само по себе странно, потому что-rf
должно переопределять эту ошибку. Это поведение также может быть продублировано в командной строке сервера.
Кажется, я не могу найти ничего, связанного с любой из этих проблем в Интернете, поэтому я надеясь, что это просто я совершаю глупую ошибку, а не проблема с моей установкой или USB-накопителем. Заранее спасибо за любую помощь!
Редактировать: На самом деле у меня есть третья проблема, которая, вероятно, связана с первой. После выполнения команды shell_exec("tar -xzf")
для распаковки моего архива в результирующем каталоге всегда добавляется несколько странных символов. Например, для одного запуска со сжатым каталогом, называемым BOOT, распакованный каталог отображается в терминале как BOOT??w??????.???w???
, и его эхо-выход отображается как BOOT²w▀╚.∙wâ–€
. При использовании tab для ввода команды cd
в этот каталог я получаю строку с почти идентичным шаблоном: BOOT\302\262w\342\226\200\342\225\232
2.\342\210\231w\342\226\200/
. В 99% случаев это не влияет на выполнение скрипта, но иногда это приводит к тому, что скрипт не может сканировать каталог.
2 answers
Для #1 кажется, что там появляются какие-то странные персонажи.
Попробовал это на своей машине, и, похоже, это сработало:
<?php
for($x = 0; $x < 30 ; $x++)
shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5));
sleep(1);
Я отделил переменную внутри кавычек и добавил обратно с помощью '.'
-Кен
Оказывается, что все три проблемы имели одно и то же решение: создайте временный архив где-нибудь помимо USB-накопителя. Я понятия не имею, что вызвало появление дополнительных символов, но они исчезли раз и навсегда, когда я переместил расположение временного каталога в каталог Linux /tmp.