Руководство по PHP
Пред. |  | След.

# CXX. Phar archive stream and classes

# Введение

The phar extension provides the `phar` stream wrapper and the Phar class for manipulating self-contained PHP Archive (phar) files. The Phar class can be used to create and to extract contents of phar files as well as iterating over their contents.

PHP Archive files (Phars) are special collections of files that can be transparently run right out of the file, similar to Java's jar archive files. Using a phar archive, it is possible to distribute a complete PHP application in a single file that will run out of the file without modification or extraction. Phar archives can also be used to store files for extraction similar to tar or zip archive files. Phars support compression using gzip if the zlib extension is present, and using bzip2 if the bz2 extension is present. In addition, iteration and other features are available if the SPL extension is available. Phar signature verification using md5 or sha1 is natively supported if the hash extension is available.

The original implementation for Phar archives was in the PEAR package PHP_Archive, and the implementation details are very similar.

# Требования

Phar requires PHP 5.2.0 or newer. Additional features require the SPL extension in order to take advantage of iteration and array access to a Phar's file contents. The `phar` stream does not require any additional extensions to function.

You may optionally wish to enable the zlib and bzip2 extensions to take advantage of compressed phar support. In addition, the hash extension can be used for signing phars and verifying integrity.

# Установка

Windows binaries may be found at http://snaps.php.net/. To install, download php_phar.dll to the folder specified by your php.ini file's `extension_dir` directive. Enable it by adding `extension=php_phar.dll` to your php.ini and restarting your webserver.

    extension_dir=c:/php5/exts/
    extension=php_phar.dll

Linux, BSD, and other *nix variants can be compiled using the following steps:

- Either:

  - Run the pear installer for PECL/phar: `pecl install phar`

  - Copy `phar.so` from the directory indicated by the build process to the location specified in your php.ini file under `extension_dir`.

  - Add `extension=phar.so` to your php.ini

  Or:

  - Set the path to your php.ini via:

    `pecl config-set php_ini /path/to/php.ini`

  - Run the pear installer for PECL/phar: `pecl install phar`

- Restart your webserver to reload your php.ini settings.

> Development Versions: There are currently no `stable` versions of PECL/phar, to force installation of the `alpha` version of PECL/phar execute: `pecl install phar-`alpha

> Compiling PECL/phar without using the PEAR command: Rather than using `pecl install phar` to automatically download and install PECL/phar, you may download the tarball from PECL. From the root of the unpacked tarball, run: `phpize && ./configure --enable-phar && make` to generate `phar.so`. Once built, continue the installation from step 4 above.

Дополнительная информация, такая как новый версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, могут быть найдены здесь: http://pecl.php.net/package/phar.

# Настройка во время выполнения

Поведение этих функций зависит от установок в `php.ini`.

Таблица 1. Filesystem and Streams Configuration Options

Name | Default | Changeable | Changelog
--- | --- | --- | ---
phar.readonly | "1" | PHP_INI_SYSTEM | Available Since version 1.0.0
phar.require_hash | "0" | PHP_INI_SYSTEM disable/enable, PHP_INI_ALL enable | Available Since version 1.0.0

Краткое разъяснение конфигурационных директив.

`phar.readonly` boolean

  This option disables creation or modification of Phar archives using the `phar` stream or Phar object's write support. This setting should always be enabled on production machines, as the phar extension's convenient write support could allow straightforward creation of a php-based virus when coupled with other common security vulnerabilities.

  > Замечание: This setting can only be set in php.ini due to security reasons.

`phar.require_hash` boolean

  This option will force all opened Phar archives to contain some kind of signature (currently md5 and sha1 are supported), and will refuse to process any Phar archive that does not contain a signature.

  > Замечание: The option can be disabled in the system level only, but can be enabled using ini_set() in a user script regardless of the system setting.

# Типы ресурсов

The Phar extension provides the `phar` stream, which allows accessing files contained within a phar transparently. The file format of a Phar is described here

# Предопределенные классы

Phar
PharFileInfo

# Phar file format

All Phar files contain three to four sections:

1. a stub

2. a manifest describing the contents

3. the file contents

4. [optional] a signature for verifying Phar integrity

# Phar file stub

A Phar's stub is a simple PHP file. The smallest possible stub follows:

`<?php __HALT_COMPILER();`

A stub must contain as a minimum, the `__HALT_COMPILER();` token at its conclusion. Typically, a stub will contain loader functionality like so:

`<?php Phar::mapPhar(); include 'phar://myphar.phar/index.php'; __HALT_COMPILER(); ?>`

There are no restrictions on the contents of a Phar stub, except for the requirement that it conclude with `__HALT_COMPILER();`. The closing PHP tag `?>` may be included or omitted, but there can be no more than 1 space between the `;` and the close tag `?>` or the phar extension will be unable to process the Phar archive.

# Phar Manifest Format

The Phar manifest is a highly optimized format that allows per-file specification of file compression, file permissions, and even user-defined meta-data such as user or group. All values greater than 1 byte are stored in little-endian byte order, with the exception of the API version, which for historical reasons is stored as 3 nibbles in big-endian order.

All unused flags are reserved for future use, and must not be used to store custom information. Use the per-file meta-data facility to store customized information about particular files.

The basic file format of a Phar archive manifest is as follows:

Таблица 2. Global Phar manifest format

Size in bytes | Description
--- | ---
4 bytes | Length of manifest in bytes (1 MB limit)
4 bytes | Number of files in the Phar
2 bytes | API version of the Phar manifest (currently 0.9.0)
4 bytes | Global Phar bitmapped flags
4 bytes | Length of Phar alias
?? | Phar alias (length based on previous)
at least 24 * number of entries bytes | entries for each file

# Global Phar bitmapped flags

Here are the bitmapped flags currently recognized by the Phar extension for the global Phar flat bitmap:

Таблица 3. Bitmap values recognized

Value | Description
--- | ---
`0x00010000` | If set, this Phar contains a verification signature
`0x00001000` | If set, this Phar contains at least 1 file that is compressed with zlib compression
`0x00002000` | If set, this Phar contains at least 1 file that is compressed with bzip compression

# Phar manifest file entry definition

Each file in the manifest contains the following information:

Таблица 4. Phar Manifest file entry

Size in bytes | Description
--- | ---
4 bytes | Filename length in bytes
?? | Filename (length specified in previous)
4 bytes | Un-compressed file size in bytes
4 bytes | Unix timestamp of file
4 bytes | Compressed file size in bytes
4 bytes | CRC32 checksum of un-compressed file contents
4 bytes | Bit-mapped File-specific flags
4 bytes | Serialized Meta-data length (0 for none)
?? | Serialized Meta-data, stored in serialize() format

The File-specific bitmap values recognized are:

Таблица 5. Bitmap values recognized

Value | Description
--- | ---
`0x000001FF` | These bits are reserved for defining specific file permissions of a file. Permissions are used for fstat() and can be used to recreate desired permissions upon extraction.
`0x00001000` | If set, this Phar contains at least 1 file that is compressed with zlib compression
`0x00002000` | If set, this Phar contains at least 1 file that is compressed with bzip compression

# Phar Signature format

Phars containing a signature always have the signature

Таблица 6. Signature format

Length in bytes | Description
--- | ---
16 or 20 bytes | The actual signature, 20 bytes for an SHA1 signature, 16 bytes for an MD5 signature.
4 bytes | Signature flags. `0x0001` is used to define an MD5 signature, and `0x0001` is used to define an SHA1 signature.
4 bytes | Magic "GBMB" used to define the presence of a signature.

Пред. | Начало | След.
PDOStatement->setFetchMode() | Уровень выше | Phar::__construct