Я работаю над скриптом PHP для автоматической декомпрессии и сканирования архивов tar.gz, расположенных на внешнем USB-накопителе, и я столкнувшись с несколькими странными проблемами. После того, как скрипт обнаруживает архив, он пытается создать временный каталог на USB-диске для распаковки архива. Чтобы гарантировать уникальное временное имя каталога (поскольку этот скрипт может выполняться несколько раз одновременно) я имя файла с использованием случайного 5-значного часть текущего времени в MD5, например, так:PHP: Странные проблемы с shell_exec («mkdir») и shell_exec («rm -rf»)
$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???
. Однако при использовании клавиши табуляции для автоматического заполнения команды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â–€
. После использования вкладки, чтобы заполнить команду cd
в этот каталог, я получаю строку с почти идентичным шаблоном: BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/
. 99% времени это не влияет на выполнение скрипта, но иногда это приводит к тому, что сценарий не может сканировать каталог.
Проблема в том, что мне нужно сохранить имя временного каталога в переменной (я мог бы найти его с помощью команд терминала, но это кажется излишне крутым). Я пробовал это следующим образом: 'shell_exec (« mkdir ». $ Temp);' но это, похоже, не имело значения. – NinjaBlob
Вы можете просто отбросить переменную $ temp? Я предполагаю, что некоторые персонажи, не относящиеся к ascii, попадают туда. –
Я пробовал, но у меня все еще была такая же проблема: 'ob_start(); echo $ temp; $ temp = ob_get_clean(); ' – NinjaBlob