2014-02-06 1 views
1

У меня есть автоматическая задача, которая прослушивает 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 и дать ему три или около попыток, но я надеюсь, что есть более элегантное решение.

+0

Угадай, файл еще не готов, то есть он доступен для чтения, но еще не содержит весь контент? также код ur выглядит опасным, вы можете позволить злоумышленникам вставлять содержимое в командную строку, откуда поступают $ clientID, $ location, $ filename, $ zip_passwd? – nrathaus

+0

Эти переменные происходят из других мест в php-скрипте (т. Е. Глобальных переменных, параметров функции). Я сузил проблему до процесса 7zip, поэтому я не стал заморачиваться с этой записью с остальной частью скрипта. – spencer4of6

+1

Могу ли я предложить вариант «отладки», прежде чем вы запустите 7za, скопируйте файл в каталог/tmp /, а затем запустите 7za, по крайней мере, если он не сработает, вы знаете, как выглядит файл с ошибкой, потому что на данный момент , Я думаю, что у вас есть состояние гонки – nrathaus

ответ

0

Похоже, у вас есть состояние гонки. Попробуйте вариант отладки в комментариях.

Смежные вопросы