この記事では、PHP で Phar コード パッケージ化ツールを使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
#Phar は、PHP5 ツールの後に提供されるコードパッケージ化ツールです。本来はJavaのJarファイル形式のコードパッケージですが、PHP自体はコンパイルされていないため、実際にはこのPharはコンパイルせずにコードをそのままパッケージ化しています。ただし、パッケージ化された Phar パッケージを圧縮することはできます。
さらに、Phar パッケージを実際に使用したことがある人は非常に少なく、特に Composer が事実上のコード ライブラリ標準となっている今日では、Phar を見つけるのはさらに困難です。ただし、Composer インストール パッケージ自体も .phar パッケージ ファイルです。
主な理由は、Phar 形式でのコード パッケージのインストールが Composer ほど単純かつ便利ではないためです。一方、Go のような初期のプログラマ、特に LAMP/LAMP プログラマは、オープン ソースをコピーします。ツールキットを直接使用するのではなく、コードを使用します。
やはり、ソースコードが手元にあると安心です。実際、Composer がソース コードを直接ダウンロードしたとしても、実際にソース コードを調べた人は誰もいません。 Phar と比較した Composer の最大の利点は、コードの自動ロードと標準の PSR コマンド スペースとディレクトリ仕様です。これら 2 つは Phar では使用できないため、Phar パッケージを使用したい場合はこれらを必須にする必要があります。
これは古いものですが、私たちはまだそれについて簡単に学びます。おそらく、特に一部の内部パブリック ライブラリ関数をカプセル化する場合、コードをパッケージ化する Phar の方法が依然として非常に役立つ場合に、これを使用できるようになるでしょう。
まず、標準形式でディレクトリ ツリーを作成します。
このディレクトリ ツリーでは、src ディレクトリにソース コードが保存され、build ディレクトリは生成された .phar コード パッケージの保存に使用されます。
// index.php <?php require_once "phar://myphar.phar/common.php";
index.php ファイルでは、単に common.php を参照します。 common.php ファイルのロードには phar 擬似プロトコルが使用されることに注意してください。擬似プロトコルの内容については以前記事で解説しました。
<?php // common.php class Manager{ public static function run($config){ echo "AAA", PHP_EOL; var_dump($config); } public static function ChineseMobile($mobile){ if(preg_match("/^1[34578]\d{9}$/", $mobile)){ return true; } return false; } }
common.php ファイルには、テスト用のクラスと 2 つの簡単なメソッドのみが提供されています。 run() メソッドは、印刷されたコンテンツと渡されたパラメーターを出力するだけです。 ChineseMobile() メソッドは、国内の携帯電話番号を決定するために提供される関数です。
[database] host=localhost db=dbname user=myuser pass=dbpass
config.ini は構成ファイルです。実際、構成ファイルを Phar コード内で直接読み取ることも、コードとともに指定されたディレクトリに構成ファイルをビルドすることもできます。
ソース コード ファイルの準備ができました。次のステップは、パッケージ化されたコンパイル済みファイルを準備することです。
// create-phar.php $srcRoot = "./myphar/src"; $buildRoot = "./myphar/build"; $phar = new Phar($buildRoot . "/myphar.phar", FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, "myphar.phar"); $phar["index.php"] = file_get_contents($srcRoot . "/index.php"); $phar["common.php"] = file_get_contents($srcRoot . "/common.php"); $phar->setStub($phar->createDefaultStub("index.php")); copy($srcRoot . "/config.ini", $buildRoot . "/config.ini");
コードは複雑ではありません。主に Phar クラスです。このクラスは、生成されるファイルのディレクトリとファイル名を指定し、createDefaultStub() メソッドを使用してエントリ ファイル インデックスを呼び出す必要があります。このメソッドは、指定された .phar ファイルを作成するためのスタブです。実際には、Java の main() メソッドのエントリと同じように、エントリ ファイルを指定します。
次に、config.ini ファイルをリリース ディレクトリ ビルドにコピーしました。
次に、コマンド ラインを使用して create-phar.php ファイルを実行し、このコード パッケージを生成します。
# php ./create-phar.php
テキスト エディタを使用して myphar.phar ファイルを開きます。これはまだ見慣れた PHP コードであることがわかります。それを一番下まで引っ張ると、インデックスが表示されます。 .php および common.php の内容がこのファイルにコンパイルされます。上記の自動生成コードは、Phar 拡張機能によって準備されたブートストラップまたは事前に準備されたステートメントです。ユーザーが作成したすべてのソース コードは、このファイルの最後にあります。つまり、Composer インストール パッケージ (.phar ファイル) をダウンロードして、その内容を確認することができます。
次のステップはそれを使用することです。これは非常に簡単です。
$config = parse_ini_file("./myphar/build/config.ini"); require './myphar/build/myphar.phar'; Manager::run($config); // AAA // array(4) { // ["host"]=> // string(9) "localhost" // ["db"]=> // string(6) "dbname" // ["user"]=> // string(6) "myuser" // ["pass"]=> // string(6) "dbpass" // } var_dump(Manager::ChineseMobile('13811111111')); var_dump(Manager::ChineseMobile('138111111112')); // bool(true) // bool(false)
前述のように、コード ライブラリとしては、Phar は長らく Composer に負けていましたが、一部のインストール パッケージとして使用されているだけでなく、使用されるだけでなく、Phar 自体も圧縮ツールです。一部のファイル、テキスト、ディレクトリなどをアーカイブするために使用できます。次に、Phar がテキスト アーカイブにどのように使用されるかを簡単に見てみましょう。
unlink('./my.phar'); unlink('./my.phar.bz2'); unlink('./my.phar.gz'); $p = new Phar('./my.phar', 0 ,'my.phar'); $p['myfile1.txt'] = 'hi1'; $p['myfile2.txt'] = 'hi2'; $p1 = $p->compress(Phar::GZ); $p2 = $p->compress(Phar::BZ2); unset($p); $decompressPhar = new Phar('./my.phar', 0 ,'my.phar'); foreach($decompressPhar as $file){ // $file 是返回的 PharFileInfo 对象 var_dump($file->getFileName()); var_dump($file->isCompressed()); var_dump($file->isCompressed(Phar::BZ2)); var_dump($file->isCompressed(Phar::GZ)); var_dump($file->getContent()); } echo '==================', PHP_EOL; // string(11) "myfile1.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi1" // string(11) "myfile2.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi2"
首先,依然是实例化一个 Phar 类,然后我们给它像数组一样增加属性,这样,属性内容就被打包进了 .phar 文件中。通过直接查看 my.phar 文件,我们可以看出,myfile1.txt 这两个属性直接被写成了文件进行保存了,也就是说,它帮我们将文本转化成文件并打包在了 my.phar 这个压缩包文件中了。
compress() 方法则是将当前的这个 Phar 对象压缩存储为某个格式的文件。这里我们直接压缩了 Bzip2 和 GZ 文件。调用这个方法后直接就会生成对应的压缩文件。
Phar 对象在遍历时产生的对象是 PharFileInfo 对象,它拥有很多类似于 File 的文件操作函数。大家可能在官方文档中找到相关的说明。
假设我们遍历 my.phar.gz ,内容依然可以正常输出,但循环中的 isCompressed() 判断都依然会是 false ,难道文件没有被压缩吗?其实,我们需要通过另一个函数来让所有文件都进行统一格式的压缩。
$p = new Phar('./my.phar', 0 ,'my.phar'); $p->compressFiles(Phar::GZ); unset($p); $decompressPhar = new Phar('./my.phar.gz', 0 ,'my.phar'); foreach($decompressPhar as $file){ // $file 是返回的 PharFileInfo 对象 var_dump($file->getFileName()); var_dump($file->isCompressed()); var_dump($file->isCompressed(Phar::BZ2)); var_dump($file->isCompressed(Phar::GZ)); var_dump($file->getContent()); } echo '==================', PHP_EOL; // string(11) "myfile1.txt" // bool(true) // bool(false) // bool(true) // string(3) "hi1" // string(11) "myfile2.txt" // bool(true) // bool(false) // bool(true) // string(3) "hi2"
使用 compressFiles() 对整个 .phar 中的所有文件进行了统一的格式压缩之后,再打印时 isCompressed() 就会返回对应格式的 true 了。
最后,如果只是为了打包压缩功能的话,我们没必要使用 Phar 类。Phar 类最主要的还是用来打包能够运行的 PHP 源码,也就是它的 createDefaultStub() 方法非常重要。而如果只是打包普通文件的话,我们并不需要这个方法,这时,我们就可以使用另外一个 PharData 类来进行数据的打包压缩。使用方法和 Phar 类是一模一样的。同时,PharData 类可以直接打包成 tar 之类的文件。
$p = new PharData('./myData.tar'); $p['myfile1.txt'] = 'hi1'; $p['myfile2.txt'] = 'hi2'; foreach($p as $file){ var_dump($file->getFileName()); var_dump($file->isCompressed()); var_dump($file->isCompressed(Phar::BZ2)); var_dump($file->isCompressed(Phar::GZ)); var_dump($file->getContent()); } echo '==================', PHP_EOL; // string(11) "myfile1.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi1" // string(11) "myfile2.txt" // bool(false) // bool(false) // bool(false) // string(3) "hi2"
说实话,Phar 真的是一个冷门项目,但是在某些情况中又非常有用,比如它虽然在代码包领域被 Composer 打败了,但是它又可以成为 Composer 的安装包,也就是说,没有 Phar 你就安装不了 Composer 。而做为压缩工具,虽然有强大的实力但使用的却也非常的少。因此,我们还是以了解为目的,如果感觉某些场景非常合适的话,也完全可以深入的研究拿来放到我们的实际项目中使用。毕竟它是 PHP 的一部分,不需要任何的编译安装及其它支持,非常原生。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3Phar%E4%BB%A3%E7%A0%81%E6%89%93%E5%8C%85%E5%B7%A5%E5%85%B7%E7%9A%84%E4%BD%BF%E7%94%A8.php
推荐学习:php视频教程
以上がPharコードパッケージ化ツールをPHPで使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。