So verwenden Sie das Phar-Code-Paketierungstool in PHP

醉折花枝作酒筹
Freigeben: 2023-03-10 18:12:01
nach vorne
2887 Leute haben es durchsucht

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.

So verwenden Sie das Phar-Code-Paketierungstool in PHP

Verstehen Sie kurz die Verwendung des Phar-Code-Paketierungstools

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.

Code-Paketierung

Wir erstellen zunächst einen Verzeichnisbaum in einem Standardformat.

So verwenden Sie das Phar-Code-Paketierungstool in PHP

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";
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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");
Nach dem Login kopieren

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
Nach dem Login kopieren

So verwenden Sie das Phar-Code-Paketierungstool in 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 &#39;./myphar/build/myphar.phar&#39;;

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(&#39;13811111111&#39;));
var_dump(Manager::ChineseMobile(&#39;138111111112&#39;));
// bool(true)
// bool(false)
Nach dem Login kopieren

Komprimierungsfähigkeit

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(&#39;./my.phar&#39;);
unlink(&#39;./my.phar.bz2&#39;);
unlink(&#39;./my.phar.gz&#39;);
$p = new Phar(&#39;./my.phar&#39;, 0 ,&#39;my.phar&#39;);
$p[&#39;myfile1.txt&#39;] = &#39;hi1&#39;;
$p[&#39;myfile2.txt&#39;] = &#39;hi2&#39;;
$p1 = $p->compress(Phar::GZ);
$p2 = $p->compress(Phar::BZ2);
unset($p);

$decompressPhar  = new Phar(&#39;./my.phar&#39;, 0 ,&#39;my.phar&#39;);
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 &#39;==================&#39;, 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"
Nach dem Login kopieren

首先,依然是实例化一个 Phar 类,然后我们给它像数组一样增加属性,这样,属性内容就被打包进了 .phar 文件中。通过直接查看 my.phar 文件,我们可以看出,myfile1.txt 这两个属性直接被写成了文件进行保存了,也就是说,它帮我们将文本转化成文件并打包在了 my.phar 这个压缩包文件中了。

compress() 方法则是将当前的这个 Phar 对象压缩存储为某个格式的文件。这里我们直接压缩了 Bzip2 和 GZ 文件。调用这个方法后直接就会生成对应的压缩文件。

Phar 对象在遍历时产生的对象是 PharFileInfo 对象,它拥有很多类似于 File 的文件操作函数。大家可能在官方文档中找到相关的说明。

假设我们遍历 my.phar.gz ,内容依然可以正常输出,但循环中的 isCompressed() 判断都依然会是 false ,难道文件没有被压缩吗?其实,我们需要通过另一个函数来让所有文件都进行统一格式的压缩。

$p = new Phar(&#39;./my.phar&#39;, 0 ,&#39;my.phar&#39;);
$p->compressFiles(Phar::GZ);
unset($p);

$decompressPhar  = new Phar(&#39;./my.phar.gz&#39;, 0 ,&#39;my.phar&#39;);
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 &#39;==================&#39;, 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"
Nach dem Login kopieren

使用 compressFiles() 对整个 .phar 中的所有文件进行了统一的格式压缩之后,再打印时 isCompressed() 就会返回对应格式的 true 了。

数据格式 Phar

最后,如果只是为了打包压缩功能的话,我们没必要使用 Phar 类。Phar 类最主要的还是用来打包能够运行的 PHP 源码,也就是它的 createDefaultStub() 方法非常重要。而如果只是打包普通文件的话,我们并不需要这个方法,这时,我们就可以使用另外一个 PharData 类来进行数据的打包压缩。使用方法和 Phar 类是一模一样的。同时,PharData 类可以直接打包成 tar 之类的文件。

$p = new PharData(&#39;./myData.tar&#39;);
$p[&#39;myfile1.txt&#39;] = &#39;hi1&#39;;
$p[&#39;myfile2.txt&#39;] = &#39;hi2&#39;;

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 &#39;==================&#39;, 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"
Nach dem Login kopieren

总结

说实话,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
Nach dem Login kopieren

推荐学习: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!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage