PHARは、JavaのJARに類似したPHPで実行可能アーカイブを作成するためのユーティリティです。
PHARを使用すると、多くのファイルを1つにまとめることができます。その結果、アプリケーションは1つのファイルと同様にライブラリ全体で動作できます。
PHARは、TAR、ZIP、および実際にはPHARなどの形式を作成、読み取り、書き込み、および変換できます。
アーカイブ内のファイルへのアクセスは、アーカイブを解凍する必要なく、PHP Stream Wrapperを介して直接実行されます。つまり、PHP Stream Wrapperをサポートするすべての機能はアーカイブのファイルを処理します。
必要条件
PHARアーカイブを使用するには、PHAR、zlib、およびbzip2拡張機能を備えたバージョン5.2以上のPHPが必要です(PHP 5.3がある場合、PHARはデフォルトですでにインストールされています)。
安全性
デフォルトでは、PHARアーカイブには読み取り専用アクセスがあります。 必要に応じて、php.iniでphar.readonly = 0を設定できます。
さらに、PHARアーカイブはPHPインタープリターによってのみ実行できます。
例
テキストファイルでアーカイブを作成します。
$phar = new Phar('test.phar'); $phar[hello_habr.txt] = 'Hello Habr!';
その内容を読んでください:
echo file_get_contents('phar://test.phar/hello_habr.txt');
スタブファイル
「スタブ」は、PHARアーカイブが接続されたときに最初に読み込まれるファイルであり、これは一種のブートストラップです。 このファイルは、アーカイブが完全に接続されている場合にのみ解釈されます。 スクリプトがアーカイブの特定のファイルのみを使用する場合、スタブファイルは解釈されません。
例を見てみましょう:
//- include_once('some_archive.phar'); //- include_once('phar://some_archive.phar/somefile.php');
スタブファイルを作成するときは、ファイルの最後で__HALT_COMPILER()呼び出しを使用します。
スタブファイルへのアクセスは、例のようにgetStub()メソッドを呼び出すことで取得できます。
$phar = new Phar('some_archive.phar'); $stub = $phar->getStub();
デフォルトのスタブファイルを設定するには、setDefaultStub()メソッドを使用します。
$phar = new Phar('some_archive.phar'); $phar->setDefaultStub('cli.php', 'web/index.php');
アーカイブコンテンツの作成
重要:php.iniでphar.readonly = 0を設定します
コンテンツを作成する方法はいくつかあります。
- オブジェクトプロパティを通じて
- Phar :: addFile()
- Phar :: addFromString()
- Phar :: addEmptyDir()
- Phar :: buildFromDirectory()
- Phar :: buildFromIterator()
いくつかの例:
$phar = new Phar('habr.phar'); $phar['index.php'] = file_get_contents('some/path/to/file.php'); // (ArrayAccess)
$phar = new Phar('habr.phar'); $phar->addFile('http://habrahabr.ru', 'HabrHomePage.html'); $phar->addFromString('HabrHomePage', file_get_contents('http://habrahabr.ru')); $phar = new Phar('habr.phar'); $phar->addEmptyDir('temporary/'); $phar->buildFromDirectory('some_directory/');
$phar = new Phar('habr'); $dir = 'somedir/'; $phar->buildFromIterator( new RecursiveDirectoryIterator($dir) );
アーカイブからの読み取り
録音と同様に、いくつかの方法があります。
- PHARストリームラッパー(phar://)
- 直結
- Phar :: extractTo()
- 「Phar」インスタンスの繰り返し
PHARアーカイブ署名
署名は、データの検証に使用されます。
PHARは4つの署名生成アルゴリズムをサポートしています。
- MD5
- SHA1
- SHA256
- SHA512
署名を設定するには、2つのパラメーターを取るPhar :: setSignatureAlgorithm()メソッドを使用します。
- 署名タイプ:
- Phar :: MD5
- Phar :: SHA1
- Phar :: SHA256
- Phar :: SHA512
- Phar :: OPENSSL
- 秘密鍵-OpenSSL秘密鍵
コード例:
$phar=new Phar('habr.phar'); $phar->buildFromDirectory('habr/'); $signatures=Phar::getSupportedSignatures(); if (in_array(PHAR::SHA512,$signatures)) { $phar->setSignatureAlgorithm(PHAR::SHA512); } elseif (in_array(PHAR::SHA256,$signatures)) { $phar->setSignatureAlgorithm(PHAR::SHA256); } elseif (in_array(PHAR::SHA1,$signatures)) { $phar->setSignatureAlgorithm(PHAR::SHA1); } elseif (in_array(PHAR::MD5,$signatures)) { $phar->setSignatureAlgorithm(PHAR::MD5); }
OpenSSLの場合:
$phar=new Phar('habr.phar'); $phar->buildFromDirectory('habr/'); $OSSLPrivateKey=openssl_get_privatekey(file_get_contents('private.pem')); $OSSLPKey=''; openssl_pkey_export($OSSLPrivateKey,$OSSLPKey); $phar->setSignatureAlgorithm(Phar::OPENSSL,$OSSLPKey);
ZIPおよびTAR
PHARは、ZIPおよびTARアーカイブの読み取りをサポートしています。 同時に、通常のPHARアーカイブであるかのように読み取りが行われます。 ただし、名前の長さは、ファイルへのパスを含めて255バイトを超えてはならず、アーカイブを実行可能にするには、名前に「.phar」が含まれている必要があります(habr.pharなど)。 gz)
アーカイブは、gzipまたはbzip2の2つのアルゴリズムのいずれかを使用して圧縮されます。
php.iniでphar.readonly = 1であってもZIPおよびTARアーカイブを作成できますが、この場合、名前にスタブファイルまたは '.phar'を含めることはできません。
アーカイブ形式を変換する
アーカイブの変換は、次の2つの方法で実行できます。
1. Phar :: ConvertToData()。3つのパラメーターを取ります。形式(Phar :: TAR、Phar :: ZIP)、圧縮(Phar :: NONE、Phar :: GZ、Phar :: BZ2)、および拡張子(.tar、 .tar.bz2、.tar.gz、.zip)。
2. Phar :: ConvertToExecutable()。最後の-拡張子を除くすべての同じパラメーターを受け入れます。 PHAR、ZIP、またはTAR形式にそれぞれ基づいているにもかかわらず、さらに多くのオプションがあります:.phar、.phar.gz、.phar.bz2、.phar.tar、.phar.tar.gz、.phar.tar.bz2 、.phar.zip
圧縮
上で書いたように、GzipとBzip2の2つの圧縮方法を使用できますが、アーカイブ自体とその中のファイルの両方を圧縮できます。
アーカイブを圧縮するには、compress()メソッドを使用する必要があります。このメソッドは、圧縮のタイプとファイル拡張子の2つのパラメーターを取ります。
$phar=new Phar('habr.phar'); $phar->buildFromDirectory('habr/'); if (Phar::canCompress(Phar::GZ)) { $phar->compress(Phar::GZ,'.phar.gz'); } else if (Phar::canCompress(Phar::BZ2)) { $phar->compress(Phar::BZ2,'.phar.bz2'); }
ファイル圧縮の場合-1つのパラメーターを持つcompressFiles()-圧縮タイプ:
$phar=new Phar('habr.phar'); $phar->buildFromDirectory('habr/'); if (Phar::canCompress(Phar::GZ)) { $phar->compressFiles(Phar::GZ); } else if (Phar::canCompress(Phar::BZ2)) { $phar->compressFiles(Phar::BZ2); }
性能
APCを使用すると、PHARのパフォーマンスは最大6倍になります。
キャッシュなし-PHARなしとほぼ同じです。
まとめ
そして、要約すると:
- PHARは簡単にインストールできます。むしろ、標準のPHP 5.3ディストリビューションの一部です。
- 使い方は簡単です。
- 展開が簡単-ファイルは1つだけです。
- 十分に保護されています-署名、OpenSSL。
- 高性能です。