Phar アーカイブの使用法: 導入
Phar アーカイブは Java の JAR アーカイブと似た概念のものですが、
PHP アプリケーションで使用する際に必要な機能をより柔軟に使用できるよう改良しています。
Phar アーカイブを使用すると、PHP アプリケーションやライブラリを
ひとつのファイルにまとめて配布できるようになります。
Phar アーカイブ形式のアプリケーションは、その他の PHP
アプリケーションとまったく同様に扱えます。
Phar アーカイブ形式のライブラリを使用する方法も、
その他の通常の PHP ライブラリとまったく同じです。
phar ストリームラッパーは phar 拡張モジュールの要となるものです。
詳細については こちら
で説明します。このストリームラッパーを使用すると、
phar 内の個々のファイルに対して
fopen() や opendir()
といった標準のファイル操作関数を使用でき、
まるで通常のファイルシステム上にあるのと同じような感覚でアクセスできます。
phar ストリームラッパーは、
ファイルやディレクトリに対する読み書き操作をすべてサポートしています。
Phar クラスでは、
ファイルへのアクセスや phar アーカイブ作成用により高度な機能も実装しています。
Phar クラスについての説明は
こちら をご覧ください。
さらに、phar ファイルの中身の検証を行うこともできます。対称型ハッシュアルゴリズム
(MD5、SHA1、SHA256、そしてもし ext/hash が有効ならさらに SHA512) のいずれか、
あるいは OpenSSL を使用した非対称公開鍵/秘密鍵ペアによる署名のいずれかを使用します。
OpenSSL による署名を使用するには、
まず公開鍵/秘密鍵のペアを作成し、秘密鍵を使用して
Phar::setSignatureAlgorithm() で署名を行います。
公開キーによる展開はこのようなコードで行います。
<?php
$public = openssl_get_publickey(file_get_contents('private.pem'));
$pkey = '';
openssl_pkey_export($public, $pkey);
?>
公開鍵は phar アーカイブと同じ場所、名前でなければなりません。つまり、phar アーカイブの保存先が
/path/to/my.phar の場合は公開鍵を
/path/to/my.phar.pubkey としなければなりません。
そうしないと、OpenSSL 署名の検証ができなくなります。
Phar には 3 つのstaticメソッド
Phar::webPhar()、
Phar::mungServer() そして Phar::interceptFileFuncs()
が追加されました。これは、通常のファイルシステム用あるいはウェブアプリケーション用の
PHP アプリケーションのパッケージを作成する際に重要となります。
Phar::webPhar() は、HTTP のコールを phar
アーカイブ内の特定の場所に転送するフロントコントローラを実装します。
Phar::mungServer() は
$_SERVER 配列の中身をうまく変更して
アプリケーションでその値を使えるようにします。
Phar::interceptFileFuncs() は、
fopen() や file_get_contents()、opendir()
そしてすべての stat 系関数 (file_exists()、is_readable() など)
のコールを Phar が横取りして、相対パスを phar アーカイブ内の適切な位置に変換するようにします。
たとえば、あの有名な phpMyAdmin を phar アーカイブにすることを考えてみましょう。
必要なのは、こんな単純なスクリプトだけです。あとは、
ユーザー名とパスワードを変更してウェブサーバー上から
phpMyAdmin.phar.tar.php にアクセスするだけで利用できます。
shaun at shaunfreeman dot co dot uk ¶15 years ago
If you are trying to use Phar for a web application and just getting a blank screen, if you have enabled suhosin as well you have to add:
suhosin.executor.include.whitelist="phar"
to "/etc/php5/conf.d/suhosin.ini" file or your "php.ini" file.
once done everything works fine and dandy.
ch1902 ¶12 years ago
If you are going to be running a webPhar from the browser, for example http://localhost/myphar.phar then you will probably have to associate the .phar extension with PHP in your webserver to interpret the PHP code. In Apache modify httpd.conf to include
AddType application/x-httpd-php .php .phar
frame86 at live dot com ¶12 years ago
The openssl example is completely wrong. The public key must be extracted from certificate and openssl_pkey_export() is for private key only.
Working example:
<?php
$publicKey = openssl_get_publickey(file_get_contents('certificate.pem'));
$details = openssl_pkey_get_details($publicKey);
file_put_contents('my.phar.pubkey', $details['key']);
?>
No need to say that the best and strongest encryption of my.phar/.phar/signature.bin is useless if the consumer does not check against a valid fingerprint or certificate of public key as anybody can open, read, recreate and sign a new archive with new key. Do you do? Think about it.