Edit report at https://bugs.php.net/bug.php?id=53854&edit=1
ID: 53854
Updated by: cmb@php.net
Reported by: rquadling@php.net
Summary: Missing constants for compression type.
Status: Assigned
Type: Bug
Package: Zip Related
Operating System: n/a
PHP Version: 5.3SVN-2011-01-27 (SVN)
Assigned To: aharvey
Block user comment: N
Private report: N
New Comment:
> I've got a zip file and .phpt test to cover the compression> methods I have found.
If you still have them, it would be great if you can make a PR.
> Given what I've found so far, I'm guessing that php_zip only> really supports storing and deflating/inflating.
php_zip relies on libzip, and this supports only these two
methods, see
<http://www.nih.at/libzip/zip_set_file_compression.html>.
Previous Comments:
------------------------------------------------------------------------
[2011-01-31 15:16:53] rquadling@php.net
I've built a zip file containing the following compression methods (the table below shows the
value, the constant name and ZipArchive::getStatusString()'s output when decompression is
attempted and fails) :
0 : CM_STORE : Decompression supported.
1 : CM_SHRINK : Compression method not supported.
6 : CM_IMPLODE : Compression method not supported.
8 : CM_DEFLATE : Decompression supported.
9 : CM_DEFLATE64 : Compression method not supported.
10 : CM_PKWARE_IMPLODE : Compression method not supported.
12 : CM_BZIP2 : Compression method not supported.
14 : CM_LZMA : Compression method not supported.
97 : CM_WAVPACK : Compression method not supported.
98 : CM_PPMD : Compression method not supported.
I cannot find any app that will create a ZIP file using the following compression methods.
2 : CM_REDUCE_1
3 : CM_REDUCE_2
4 : CM_REDUCE_3
5 : CM_REDUCE_4
18 : CM_TERSE
19 : CM_LZ77
I have Terse (Hercules app) and LZ77 (I think this is the Microsoft Compress format), but they do
not create .ZIP files and the files magic-bytes are not zip related - so you can't just call
the file a .zip file and get away with it.
I've got nowhere with REDUCE.
I've got a zip file and .phpt test to cover the compression methods I have found.
Given what I've found so far, I'm guessing that php_zip only really supports storing and
deflating/inflating. The constants for the compression methods that I've managed to test should
be exposed.
Those that I've not should be removed be unexposed and removed from the documentation.
But I'd like to add to the docs something along the lines of "Other compression methods
may exist."
Richard.
------------------------------------------------------------------------
[2011-01-28 12:27:04] pajoye@php.net
Let try to keep this discussion sane...:
We can keep them only if it is supported at least to read the information about
an entry. For example, if an entry uses LZ77, then doing a stat/reading the info
MUST return CW_LZ77.
If that's not the case, then we must remove them as it makes no sense to expose
them to the user.
Is it more clear now? :)
------------------------------------------------------------------------
[2011-01-28 12:11:02] rquadling@php.net
Just as an aside, the error constants that ARE documented ... I can see no way to
generate them. None of the methods or functions in php_zip return an error
constant. Should these be removed?
------------------------------------------------------------------------
[2011-01-28 12:06:05] pajoye@php.net
That's what I asked. We can keep them only and only if libzip detects AND uses
these compression types correctly. It seems to be the case. Can you confirm it and
maybe add a test per compression method?
------------------------------------------------------------------------
[2011-01-28 12:03:35] rquadling@php.net
I took a file (an uncompressed WAV file) and compressed it using WinZip V15 using different
algorithms.
Using the following code ...
<?php
$zip = new ZipArchive;
$zip->open('wav.zipx');
foreach(range(0, $zip->numFiles - 1) as $index) {
print_r($stat = $zip->statIndex($index));
$zip->extractTo('.', array($stat['name']));
echo $zip->getStatusString(), PHP_EOL;
}
$zip->close();
Outputs ...
Array
(
[name] => WavPack.wav
[index] => 0
[crc] => 1384274557
[size] => 154826
[mtime] => 1296208410
[comp_size] => 45366
[comp_method] => 97
)
Compression method not supported
Array
(
[name] => PPMD.wav
[index] => 1
[crc] => 1384274557
[size] => 154826
[mtime] => 1296208410
[comp_size] => 100729
[comp_method] => 98
)
Compression method not supported
Array
(
[name] => LZMA.wav
[index] => 2
[crc] => 1384274557
[size] => 154826
[mtime] => 1296208410
[comp_size] => 68162
[comp_method] => 14
)
Compression method not supported
Array
(
[name] => BZIP2.wav
[index] => 3
[crc] => 1384274557
[size] => 154826
[mtime] => 1296208410
[comp_size] => 104633
[comp_method] => 12
)
Compression method not supported
As you can see, 98, 97, 14 and 12 are all identified as the comp_method (correctly). None of these
compression methods are supported by php_zip, but the constants should be present to allow
determination of the method used.
Interestingly WavPack was the best algorithm to use on uncompressed audio (which WinZip performed
when I asked it to "compress to the smallest size").
I can send the zip file if needed (300K).
I think it is important to remember that the zip files being accessed by php_zip may not have been
produced by php_zip.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=53854
--
Edit this bug report at https://bugs.php.net/bug.php?id=53854&edit=1