Maison  >  Article  >  développement back-end  >  Comment utiliser l'outil d'empaquetage de code Phar en php

Comment utiliser l'outil d'empaquetage de code Phar en php

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-06-18 17:09:102880parcourir

Cet article vous présentera comment utiliser l'outil d'empaquetage de code Phar en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment utiliser l'outil d'empaquetage de code Phar en php

Une brève introduction à l'utilisation de l'outil d'empaquetage de code Phar

Phar est un outil d'empaquetage de code fourni après l'outil PHP5. Essentiellement, il s'agit d'un package de code sous la forme d'un fichier Java Jar. Cependant, comme PHP lui-même n'est pas compilé, ce Phar conditionne en fait le code tel quel, sans compilation. Mais nous pouvons compresser le package Phar emballé.

De plus, très peu de personnes ont réellement utilisé le package Phar. Surtout aujourd'hui, alors que Composer est devenu le standard de base de code de facto, Phar est encore plus difficile à trouver. Cependant, le package d'installation de Composer lui-même est également un fichier de packaging .phar.

La raison principale est que l'installation de packages de code sous la forme de Phar n'est pas aussi simple et pratique que Composer. D'un autre côté, les premiers programmeurs, en particulier les programmeurs LAMP/LAMP, aiment copier Go. le code open source au lieu d’utiliser directement une boîte à outils.

Après tout, avoir le code source en main nous met plus à l'aise. En fait, même si Composer télécharge directement le code source, personne ne l’a jamais parcouru. Les plus grands avantages de Composer par rapport à Phar sont le chargement automatique du code et les spécifications standard de l'espace de commande et du répertoire PSR. Ces deux-là ne sont pas disponibles dans Phar, nous devons donc en avoir besoin si nous voulons utiliser le package Phar.

Bien qu'il soit obsolète, nous en apprenons encore brièvement l'existence. Peut-être pourrons-nous l'utiliser lorsque, notamment pour encapsuler certaines fonctions internes d'une bibliothèque publique, la méthode d'empaquetage du code de Phar sera encore très utile.

Emballage de code

Nous créons d'abord une arborescence de répertoires dans un format standard.

Comment utiliser loutil dempaquetage de code Phar en php

Dans cette arborescence de répertoires, le répertoire src stocke le code source et le répertoire build est utilisé pour stocker le package de code .phar généré. Dans le fichier

// index.php
<?php

require_once "phar://myphar.phar/common.php";

index.php, nous référençons simplement common.php . Notez que le pseudo-protocole phar est utilisé pour charger le fichier common.php. Nous avons déjà expliqué le contenu des pseudo-protocoles dans un article.

<?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;
    }
}

Le fichier common.php ne fournit qu'une classe et deux méthodes simples de test. La méthode run() génère simplement le contenu imprimé et les paramètres transmis. La méthode ChineseMobile() est une fonction que nous proposons pour déterminer notre numéro de téléphone mobile national.

[database]
host=localhost
db=dbname
user=myuser
pass=dbpass

config.ini est un fichier de configuration. En fait, nous pouvons lire le fichier de configuration directement dans le code Phar, ou nous pouvons créer le fichier de configuration dans le répertoire spécifié avec le code.

Le fichier de code source est prêt et l'étape suivante consiste à préparer le fichier compilé packagé.

// 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");

Le code n'est pas compliqué. Il s'agit principalement d'une classe Phar. Cette classe doit spécifier le répertoire et le nom du fichier généré, puis utiliser la méthode createDefaultStub() pour appeler le fichier d'entrée index.php. de notre package. Cette méthode est un stub pour créer le fichier .phar spécifié. En fait, il s'agit de spécifier un fichier d'entrée, tout comme l'entrée de la méthode main() en Java.

Ensuite, nous avons copié le fichier config.ini dans le répertoire de version build.

Utilisez ensuite la ligne de commande pour exécuter le fichier create-phar.php afin de générer ce package de code.

# php ./create-phar.php

Comment utiliser loutil dempaquetage de code Phar en php

Utilisez un éditeur de texte pour ouvrir le fichier myphar.phar Nous constaterons qu'il s'agit toujours du code PHP familier. Lorsque nous ferons défiler vers le bas, nous trouverons. index.php et le contenu de common.php sont compilés dans ce fichier. Les codes générés automatiquement ci-dessus sont des instructions d'amorçage ou pré-préparées, qui sont préparées pour nous par l'extension Phar. Tous les codes sources écrits par les utilisateurs seront au bas de ce fichier. En d’autres termes, vous pouvez télécharger le package d’installation de Composer, qui est le fichier .phar, et voir ce qui y est écrit.

La prochaine étape consiste à l'utiliser, c'est très simple.

$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)

Capacité de compression

Comme mentionné précédemment, en tant que base de code, Phar a déjà perdu face à Composer, mais en plus d'être utilisé comme certains packages d'installation En plus de étant utilisé, Phar lui-même est également un outil de compression. Il peut être utilisé pour archiver certains fichiers, textes, répertoires, etc. Ensuite, permettez-moi d'examiner brièvement comment Phar est utilisé pour l'archivage de texte.

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"

首先,依然是实例化一个 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"

使用 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"

总结

说实话,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视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer