У меня есть эта функция, которая распаковывает tar.gz
файл, иногда, когда дисковое пространство заполнено, файл наполовину распакован, и я получаю неполные данные, поэтому, чтобы избежать этого, я проверяю, больше ли свободного места на диске, чем размер файла.
ЗаметкаЯ использую Zend Framework v2.
use Zend\Filter\Decompress;
public function extractFiles()
{
$filter = new Decompress(
[
'adapter' => 'Tar',
'options' => array(
'archive' => $this->File,
'target' => $this->Path,
'mode' => 'gz',
),
]
);
$decompressed = null;
$freeSpace = disk_free_space($this->Path);
$fileSize = filesize($this->File);
if ($freeSpace > $fileSize) {
$decompressed = $filter->filter($this->File);
} else {
throw new Exception('Error while extracting the Tar archive');
}
return $decompressed;
}
Моя проблема здесь, я не уверен насчет этого условия, если оно предотвратит неполные данные, потому что переменная $fileSize
имеет размер сжатого файла, и его реальный размер после извлечения всегда слишком велик.
Это означает, что это условие не эффективно.
Есть идеи, как улучшить функцию?
::: РЕДАКТИРОВАТЬ :::
Я пытался использовать функцию zip_entry_filesize()
но я получил это:
PHP Fatal error: Call to undefined function zip_entry_filesize()
Я использую PHP5.
Попробуй это
try {
$filter = new Decompress(
[
'adapter' => 'Tar',
'options' => array(
'archive' => $this->File,
'target' => $this->Path,
'mode' => 'gz',
),
]
);
$decompressed = null;
$freeSpace = disk_free_space($this->Path);
$doubleFileSize = filesize($this->File) * 3;
if ($freeSpace > $doubleFileSize) {
$decompressed = $filter->filter($this->File);
return $decompressed;
}
} catch (Exception $e)
{
error_log(print_r($e->getMessage(), TRUE), 3, 'log_file_path.log');
return "Something went wrong with this erro <<" . $e->getMessage() . " >>" ;
}
Других решений пока нет …