This is a very irritating bug. You can use this to get around it though:
$data = 'some.test.string';
$phar = new PharData('test.tar');
$phar->compress(Phar::GZ, substr($data, strpos($data, '.') + 1));(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)
PharData::compress β Π‘ΠΆΠΈΠΌΠ°Π΅Ρ Π²Π΅ΡΡ Π°ΡΡ ΠΈΠ² tar/zip, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΆΠ°ΡΠΈΠ΅ Gzip ΠΈΠ»ΠΈ Bzip2
ΠΠ»Ρ tar-Π°ΡΡ ΠΈΠ²ΠΎΠ², ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΡ ΡΠΆΠ°ΡΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ Π°ΡΡ ΠΈΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ gzip ΠΈΠ»ΠΈ bzip2. Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ gunzip ΠΈΠ»ΠΈ bunzip, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠΎΠ΄ΡΠ»Ρ Phar.
ΠΠ»Ρ zip-Π°ΡΡ ΠΈΠ²ΠΎΠ² ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ±ΡΠΎΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ»Ρ gzip-ΡΠΆΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»Ρ zlib. ΠΠ»Ρ bzip2-ΡΠΆΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»Ρ bzip2.
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅Ρ Π°ΡΡ
ΠΈΠ², Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΠΊ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ .gz,
.bz2 ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΡΠ±ΠΈΡΠ°ΡΡΠ΅Π΅ Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° ΡΠΆΠ°ΡΠΈΡ Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ
Phar::NONE. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ
ΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΉΠ».
compression
ΠΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΠ½ΡΡΠ°Π½Ρ: Phar::GZ,
Phar::BZ2, ΠΈΠ»ΠΈ Phar::NONE Π΄Π»Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΠ΅ΡΡΠΈΠΈ.
extension
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°ΠΉΠ»Ρ Π½Π°Π·Π½Π°ΡΠΈΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ .tar.gz
ΠΈΠ»ΠΈ .tar.bz2 Π΄Π»Ρ ΡΠΆΠ°ΡΠΈΡ ΠΈ .tar, Π΅ΡΠ»ΠΈ ΡΠΆΠ°ΡΠΈΠ΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ PharData Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ null Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ BadMethodCallException, Π΅ΡΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»Ρ zlib ΠΈΠ»ΠΈ Π²ΡΠΊΠ»ΡΡΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»Ρ bzip2.
| ΠΠ΅ΡΡΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| 8.0.0 |
extension ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ null.
|
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ PharData::compress()
<?php
$p = new PharData('/path/to/my.tar');
$p['myfile.txt'] = 'hi';
$p['myfile2.txt'] = 'hi';
$p1 = $p->compress(Phar::GZ); // copies to /path/to/my.tar.gz
$p2 = $p->compress(Phar::BZ2); // copies to /path/to/my.tar.bz2
$p3 = $p2->compress(Phar::NONE); // exception: /path/to/my.tar already exists
?>
This is a very irritating bug. You can use this to get around it though:
$data = 'some.test.string';
$phar = new PharData('test.tar');
$phar->compress(Phar::GZ, substr($data, strpos($data, '.') + 1));This method destroys everything after the first dot in your filename and replaces it with the zip extension (.tar.gz, etc)
Example:
<?php
$tarfile = "2.5.0.0-RC1.tar";
$pd = new \PharData($tarfile);
$pd->buildFromDirectory("/path/to/contents");
$pd->compress(\Phar::GZ);
?>
Ends up with a file named "2.tar.gz"