У меня есть автоматическая задача, которая прослушивает 7zip-файл, который будет получен с удаленной машины, а затем извлекает архив. Процесс выполняется отлично, когда я вручную выталкиваю файл с удаленной машины. Тем не менее, в определенное время суток несколько десятков машин подталкивают файлы на сервере, и около 8-9% из файлов возвращает следующую ошибку, когда 7zip пытается извлечь их:Автоматическая задача 7zip - «невозможно открыть файл как архива»
7-Zip (A) [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,6 CPUs)
Processing archive: /home/pos/inbox/05730049_20140206.7z
Error: Can not open file as archive
Когда я позже чтобы извлечь их вручную, нет никаких проблем распаковкой архива:
7-Zip (A) [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,6 CPUs)
Processing archive: /data/pos/processed/05730013_20140206.7z
Extracting file01.txt
Extracting file02.txt
Extracting file03.txt
Extracting file04.txt
Extracting file05.txt
Extracting file06.txt
Extracting file07.txt
Extracting file08.txt
Extracting file09.txt
Extracting file10.txt
Everything is Ok
Files: 10
Size: 472129
Compressed: 16506
Я уверен, что нет ничего плохого в архиве, потому что (1) скрипт же на каждой удаленной машине, и это происходит только с 8-9% архивов и (2), когда я извлекаю его вручную, он не возвращает ту же ошибку. Есть ли способ убедиться, что файл правильно извлекается самостоятельно?
код PHP, который извлекает именно это:
function import_unzip($filename) {
global $debug,$fail_type,$clientID,$location,$mode;
...
if (!is_readable("/home/pos/inbox/$filename")) {
$fail_type = 'NF';
return false;
} else {
//Unzip the file
$cmd_res = exec("7za e -y -o/data/pos/$clientID$location /home/pos/inbox/$filename -p{$zip_passwd[$clientID]}",$output,$return_var);
return $success;
}
}
Мой первый наклон поставить обработку об ошибке во время цикла по команде 7z и дать ему три или около попыток, но я надеюсь, что есть более элегантное решение.
Угадай, файл еще не готов, то есть он доступен для чтения, но еще не содержит весь контент? также код ur выглядит опасным, вы можете позволить злоумышленникам вставлять содержимое в командную строку, откуда поступают $ clientID, $ location, $ filename, $ zip_passwd? – nrathaus
Эти переменные происходят из других мест в php-скрипте (т. Е. Глобальных переменных, параметров функции). Я сузил проблему до процесса 7zip, поэтому я не стал заморачиваться с этой записью с остальной частью скрипта. – spencer4of6
Могу ли я предложить вариант «отладки», прежде чем вы запустите 7za, скопируйте файл в каталог/tmp /, а затем запустите 7za, по крайней мере, если он не сработает, вы знаете, как выглядит файл с ошибкой, потому что на данный момент , Я думаю, что у вас есть состояние гонки – nrathaus