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");

Однако я столкнулся с двумя странными проблемами:

  1. Иногда, возможно, один из каждых пяти запусков, временный каталог создается с поврежденным именем. При отображении с помощью ls directory он выглядит примерно как 06191v??????.???v???. Однако при использовании клавиши tab для автоматического заполнения команды cd это заполняет гораздо более длинную строку, что-то вроде 06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/. Я знаю, что строка в порядке непосредственно перед передачей ее в shell_exec() (я даже пытался использовать substr(), чтобы ограничить ее правильной длиной, но безрезультатно), и что последовательность символов, следующих за первой косой чертой (поэтому, начиная с 342), всегда одинакова, независимо от того, каковы начальные пять символов (символ между начальными пятью и косой чертой всегда является буквой, но в остальном случайна). Кроме этого, однако я в растерянности.

  2. По какой-то причине 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% случаев это не влияет на выполнение скрипта, но иногда это приводит к тому, что скрипт не может сканировать каталог.

Author: NinjaBlob, 2013-06-25

2 answers

Для #1 кажется, что там появляются какие-то странные персонажи.

Попробовал это на своей машине, и, похоже, это сработало:

<?php

for($x = 0; $x < 30 ; $x++)
    shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5));
    sleep(1);

Я отделил переменную внутри кавычек и добавил обратно с помощью '.'

-Кен

 0
Author: Ken Koch, 2013-06-25 17:36:14

Оказывается, что все три проблемы имели одно и то же решение: создайте временный архив где-нибудь помимо USB-накопителя. Я понятия не имею, что вызвало появление дополнительных символов, но они исчезли раз и навсегда, когда я переместил расположение временного каталога в каталог Linux /tmp.

 0
Author: NinjaBlob, 2013-06-26 19:49:19