.phar-実行可能なPHPアーカイブ

この記事は、PHP 5.2の興味深い革新(バージョン5.3から標準PHPパッケージに含まれています)に捧げたいと思います-PHARです。

画像

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 = 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は4つの署名生成アルゴリズムをサポートしています。





署名を設定するには、2つのパラメーターを取るPhar :: setSignatureAlgorithm()メソッドを使用します。





コード例:

 $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なしとほぼ同じです。



まとめ



そして、要約すると:




All Articles