В каком формате PharData::extractTo извлекает файлы?

Я использую метод extractTo класса PHP PharData для проверки содержимого файл phar и столкнулся с некоторыми странными результатами. Я достиг предела своей детективной работы на уровне байтов и надеялся, что кто-нибудь здесь сможет помочь мне разобраться с этим.

Далее следуют подробности, но в целом: когда я извлекаю свои архивные файлы с помощью PharData::extractTo, файлы, которые я получаю, выглядят как bzip, но команде bzip2 они не нравятся. Это нормальное поведение phar или это проблема конкретного архива? (или, возможно, комбинация PHP/OS, которую я использую). Есть ли способ получить простые текстовые файлы из архива phar — или должен быть обычный текст по умолчанию, и я смотрю на странное поведение системы?

В частности, когда я запускаю команду

$phar = new Phar('n98-magerun.phar');
$phar->extractTo('/tmp/n98-magerun');

В моей ОС 10.6.8, Mac на базе Intel со встроенным PHP 5.3.6, архив успешно распаковывается в папку /tmp/n98-magerun.

введите здесь описание изображения

Архив, который я извлекаю, можно найти здесь.

Если я открою любой из текстовых файлов, извлеченных в BBEdit, я увижу правильное содержимое.

введите здесь описание изображения

Однако при использовании других инструментов, таких как quicklook, vi или cat, я вижу двоичные данные. Я заметил это при попытке ack/grep просмотреть содержимое файлов и не получил ожидаемых результатов.

введите здесь описание изображения

Если я использую команду file для файла, она сообщает, что это файл bzip.

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k

и проверка файла с помощью шестнадцатеричного редактора подтверждает, что файл начинается с заголовка BZ

введите здесь описание изображения

Однако попытка распаковать файл с помощью bzip2 приводит к следующей ошибке

$ bzip2 -d MIT-LICENSE.txt 
bzip2: Can't guess original name for MIT-LICENSE.txt -- using MIT-LICENSE.txt.out

bzip2: Compressed file ends unexpectedly;
    perhaps it is corrupted?  *Possible* reason follows.
bzip2: No such file or directory
    Input file = MIT-LICENSE.txt, output file = MIT-LICENSE.txt.out

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

bzip2: Deleting output file MIT-LICENSE.txt.out, if it exists.

и я могу успешно bzcat файл, хотя он рвет в середине файла с этим

bzcat: Compressed file ends unexpectedly;
    perhaps it is corrupted?  *Possible* reason follows.
bzcat: Undefined error: 0
    Input file = MIT-LICENSE.txt, output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

person Alan Storm    schedule 14.04.2013    source источник


Ответы (2)


Это файл bzip2, но для его распаковки необходимо использовать опцию --stdout (или -c) (см. ниже).

Причина, по которой вам нужна опция --stdout, заключается в том, что файл не заканчивается расширением .bz2, что позволило бы bunzip2 определить результирующее имя файла для распаковки.

$ bunzip2 --stdout MIT-LICENSE.txt 2>/dev/null
Copyright (c) 2012 netz98 new media GmbH

http://www.netz98.de

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE

Я понятия не имею, почему bunzip2 выводит следующую стандартную ошибку:

bzip2: Compressed file ends unexpectedly;
        perhaps it is corrupted?  *Possible* reason follows.
bzip2: Success
        Input file = MIT-LICENSE.txt, output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

Как сообщает команда file, файл является действительным файлом bzip2 с размером блока 400 КБ:

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k

Я попытался добавить параметр -4 к bunzip2, но он все еще жалуется:

$ bunzip2 -d -4 -vvvvv -c  MIT-LICENSE.txt >/dev/null 
  MIT-LICENSE.txt: 
    [1: huff+mtf rt+rld {0x2010d4b9, 0x2010d4b9}]
    combined CRCs: stored = 0x2010d4b9, computed = 0x2010d4b9
    [1: huff+mtf 
bunzip2: Compressed file ends unexpectedly;
        perhaps it is corrupted?  *Possible* reason follows.
bunzip2: Success
        Input file = MIT-LICENSE.txt, output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

поэтому я предполагаю, что причиной этой проблемы является программа, создающая эти файлы bzip2.

person Ross Smith II    schedule 25.04.2013
comment
+1 за детективную работу и, возможно, лучший ответ. Я копался в PHP-коде создания phar и обнаружил множество проблем, которые, хотя я не могу указать на них как на причину этих странных bzфайлов, указывают мне на некачественную реализацию как на виновника. - person Alan Storm; 26.04.2013

При использовании extractTo файлы сохраняются в том же формате, что и в архиве! Это может быть одно из следующих значений: none, gzip, bzip2.

Хотя вы, безусловно, можете сохранить их в этом формате, а затем попытаться как-то распаковать, я предлагаю следующее: Преобразуйте phar в несжатый phar и распакуйте этот архив!

Вот как:

<?php
$phar = new Phar('Someclass.phar');
$phar2 = $phar->convertToExecutable (Phar::TAR,Phar::NONE); //convert to an uncompressed tar archive
$phar2->extractTo('/some/path/'); // extract all files

Это даст вам все файлы без сжатия!

person Josef says Reinstate Monica    schedule 23.01.2015