2013-06-25 6 views
3

Я работаю над скриптом 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");

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

  1. Иногда, может быть, один из каждых пяти трасс, временный каталог создается с поврежденным именем. При отображении с использованием ls directory оно выглядит примерно как 06191v??????.???v???. Однако при использовании клавиши табуляции для автоматического заполнения команды 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â–€. После использования вкладки, чтобы заполнить команду cd в этот каталог, я получаю строку с почти идентичным шаблоном: BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/. 99% времени это не влияет на выполнение скрипта, но иногда это приводит к тому, что сценарий не может сканировать каталог.

ответ

0

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

0

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

Пробовал это на моей машине, и это, казалось, работало:

<?php 

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

Я отделил переменную внутри кавычек и добавил обратно с «»

Кен

+0

Проблема в том, что мне нужно сохранить имя временного каталога в переменной (я мог бы найти его с помощью команд терминала, но это кажется излишне крутым). Я пробовал это следующим образом: 'shell_exec (« mkdir ». $ Temp);' но это, похоже, не имело значения. – NinjaBlob

+0

Вы можете просто отбросить переменную $ temp? Я предполагаю, что некоторые персонажи, не относящиеся к ascii, попадают туда. –

+0

Я пробовал, но у меня все еще была такая же проблема: 'ob_start(); echo $ temp; $ temp = ob_get_clean(); ' – NinjaBlob