In diesem Artikel erfahren Sie, wie Sie das Phar-Code-Paketierungstool in PHP verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Phar ist ein Tool, das dem nach PHP5 bereitgestellten Code-Paket ähnelt. Im Wesentlichen handelt es sich um ein Codepaket in Form einer Java-Jar-Datei. Da PHP selbst jedoch nicht kompiliert ist, verpackt dieser Phar den Code tatsächlich so, wie er ist, ohne Kompilierung. Aber wir können das gepackte Phar-Paket komprimieren.
Darüber hinaus gibt es nur sehr wenige Leute, die das Phar-Paket tatsächlich verwendet haben. Besonders heute, wo Composer zum De-facto-Code-Basisstandard geworden ist, ist Phar noch schwieriger zu finden. Allerdings ist das Composer-Installationspaket selbst auch eine .phar-Paketdatei.
Der Hauptgrund ist, dass die Installation von Codepaketen in Form von Phar nicht so einfach und bequem ist wie die von Composer. Andererseits installieren frühe Programmierer, insbesondere LAMP/LAMP-Programmierer, gerne Open Source Code erstellen, anstatt direkt ein Toolkit zu verwenden.
Denn wenn wir den Quellcode zur Hand haben, fühlen wir uns wohler. Selbst wenn Composer den Quellcode direkt herunterlädt, hat ihn tatsächlich noch nie jemand durchgesehen. Die größten Vorteile von Composer im Vergleich zu Phar sind das automatische Laden von Code sowie die standardmäßigen PSR-Befehlsraum- und Verzeichnisspezifikationen. Diese beiden sind in Phar nicht verfügbar, daher müssen wir sie benötigen, wenn wir das Phar-Paket verwenden möchten.
Obwohl es veraltet ist, lernen und verstehen wir es dennoch kurz. Vielleicht können wir es verwenden, wenn die Methode von Phar zum Packen von Code immer noch sehr nützlich ist, insbesondere wenn einige interne öffentliche Bibliotheksfunktionen gekapselt werden.
Wir erstellen zunächst einen Verzeichnisbaum in einem Standardformat.
In diesem Verzeichnisbaum speichert das src-Verzeichnis den Quellcode und das Build-Verzeichnis wird zum Speichern des generierten .phar-Codepakets verwendet.
// index.php <?php require_once "phar://myphar.phar/common.php";
In der Datei index.php verweisen wir einfach auf common.php. Beachten Sie, dass zum Laden der Datei common.php das Phar-Pseudoprotokoll verwendet wird. Den Inhalt von Pseudoprotokollen haben wir bereits in einem Artikel erläutert.
<?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; } }
Die Datei common.php stellt nur eine Klasse und zwei einfache Methoden zum Testen bereit. Die Methode run() gibt lediglich den gedruckten Inhalt und die übergebenen Parameter aus. Die Methode ChineseMobile() ist eine Funktion, die wir zur Ermittlung unserer inländischen Mobiltelefonnummer bereitstellen.
[database] host=localhost db=dbname user=myuser pass=dbpass
config.ini ist eine Konfigurationsdatei. Tatsächlich können wir die Konfigurationsdatei direkt im Phar-Code lesen oder die Konfigurationsdatei zusammen mit dem Code im angegebenen Verzeichnis erstellen.
Die Quellcodedatei ist fertig und der nächste Schritt besteht darin, die gepackte kompilierte Datei vorzubereiten.
// 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");
Der Code ist nicht kompliziert. Diese Klasse gibt das Verzeichnis und den Dateinamen der generierten Datei an und ruft dann die Eintragsdatei index.php unseres Pakets auf Die Methode wird verwendet, um den angegebenen A-Stub der .phar-Datei zu erstellen. Tatsächlich dient es dazu, eine Eintragsdatei anzugeben, genau wie der Methodeneintrag main() in Java.
Dann haben wir die Datei config.ini in das Release-Verzeichnis build kopiert.
Dann verwenden Sie die Befehlszeile, um die Datei create-phar.php auszuführen, um dieses Codepaket zu generieren.
# php ./create-phar.php
Verwenden Sie einen Texteditor, um die Datei myphar.phar zu öffnen. Wenn wir nach unten scrollen, werden wir feststellen, dass der Inhalt von index.php und common. php sind beide hier in der Datei kompiliert. Bei den oben automatisch generierten Codes handelt es sich um einige Bootstrapping- oder vorgefertigte Anweisungen, die von der Phar-Erweiterung für uns vorbereitet werden. Alle von Benutzern geschriebenen Quellcodes befinden sich am Ende dieser Datei. Mit anderen Worten: Sie können das Composer-Installationspaket, also die .phar-Datei, herunterladen und sehen, was darin steht.
Der nächste Schritt besteht darin, es zu verwenden, das ist sehr einfach.
$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)
Wie bereits erwähnt, ist Phar als Codebibliothek seit langem von Composer besiegt worden, aber Phar selbst wird nicht nur als Installationspaket verwendet, sondern ist auch ein Komprimierungstool. Es kann zum Archivieren einiger Dateien, Texte, Verzeichnisse und dergleichen verwendet werden. Lassen Sie mich als Nächstes kurz einen Blick darauf werfen, wie Phar zur Textarchivierung verwendet wird.
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视频教程
Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Phar-Code-Paketierungstool in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!