Maison  >  Article  >  développement back-end  >  Explication détaillée du concept et de l'utilisation du fichier phar au format d'archive pour le développement PHP

Explication détaillée du concept et de l'utilisation du fichier phar au format d'archive pour le développement PHP

小云云
小云云original
2017-12-07 16:08:201170parcourir

Une application PHP est souvent composée de plusieurs fichiers. Il est très pratique de pouvoir les concentrer dans un seul fichier pour les distribuer et les exécuter. Il existe de nombreux exemples de ce type, comme l'installation d'un programme sur le système d'exploitation Windows. une bibliothèque jquery, etc. Pour ce faire, PHP utilise le format de fichier de document phar. Ce concept est dérivé du jar de java, mais il est principalement conçu pour. L'environnement Web de PHP, contrairement aux archives JAR, les archives Phar peuvent être Géré de manière native, aucun outil supplémentaire n'est nécessaire pour le créer ou l'utiliser, utilisez simplement un script php pour le créer ou l'extraire. phar est un mot composé composé de PHP et Composition de l'archive, vous pouvez voir que cela signifie un fichier d'archive php.

Pour la documentation du site officiel de phar, veuillez consulter http://php.net/manual/zh/book.phar.php Ce document peut être considéré comme complémentaire à la documentation du site officiel

. Il existe trois formats de fichiers d'archive phar : l'archive tar, l'archive zip et l'archive phar Les deux premiers types d'exécution nécessitent que Phar installe le support de l'extension Phar et sont rarement utilisés ici. format d'archive phar.

Le fichier d'archive au format phar peut être exécuté directement. Sa génération repose sur l'extension Phar et est générée par un script php écrit par vous-même.

L'extension Phar n'est pas un concept nouveau pour PHP. Elle a été intégrée à PHP en php5.3. Elle a été initialement écrite en PHP et nommée. PHP_Archive a ensuite été ajouté à la bibliothèque PEAR en 2005. Puisque les solutions PHP pures à ce problème sont très lentes en pratique, 2007 Réécrit en tant qu'extension de langage C pur et ajout de la traversée d'objets ArrayAccess à l'aide de SPL Phar Prise en charge de l'archivage. Depuis, de nombreux travaux ont été réalisés pour améliorer les performances des archives Phar.

L'extension Phar dépend du wrapper de flux php. Pour cela, veuillez vous référer à l'article précédent Flux PHP et concepts de wrapper et exemples d'utilisation

. De nombreuses applications PHP sont distribuées et exécutées au format phar. Les plus connues incluent la gestion des dépendances : composer et les tests unitaires : phpunit. Voyons comment créer, exécuter, extraire et restaurer.

Création du fichier Phar :

Modifiez d'abord l'option phar.readonly dans php.ini, supprimez le point-virgule précédent et modifiez la valeur sur off. Pour des raisons de sécurité, cette option est activée par défaut si elle est désactivée dans php.ini (la valeur est 0 ou off). ), alors il peut être activé ou désactivé dans le script utilisateur. S'il est activé dans php.ini, le script utilisateur ne peut pas être désactivé, il est donc désactivé ici pour montrer l'exemple.

Créons un projet. Créez un dossier de projet dans le répertoire racine du serveur en tant que projet. La structure du répertoire est la suivante :


file
  -yunek.js
  -yunke.css
lib
  -lib_a.php
template
  -msg.html
index.php
Lib.php


.

Le dossier de fichiers contient deux fichiers js et css avec un contenu vide. Cela démontre seulement que phar peut contenir plusieurs formats de fichiers

. Le contenu de lib_a.php est le suivant :


<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:23
 */
function show(){
  echo "l am show()";
}


Le contenu de msg.html est le suivant :


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>phar</title>
</head>
<body>
<?=$str; ?>
</body>
</html>


Le contenu de index.php est le suivant :


<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:17
 */
require "lib/lib_a.php";
show();
$str = isset($_GET["str"]) ? $_GET["str"] : "hello world";
include "template/msg.html";


Le contenu de Lib.php est le suivant :


<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:20
 */
function yunke()
{
  echo "l am yunke()";
}


Le fichier du projet est prêt, commencez à créer. Créez maintenant un yunkeBuild.php dans le même répertoire que le dossier du projet, qui est utilisé pour générer les fichiers au format phar. Le contenu est le suivant :


<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/10
 * Time: 9:36
 */
//产生一个yunke.phar文件
$phar = new Phar(&#39;yunke.phar&#39;, 0, &#39;yunke.phar&#39;);
// 添加project里面的所有文件到yunke.phar归档文件
$phar->buildFromDirectory(dirname(__FILE__) . &#39;/project&#39;);
//设置执行时的入口文件,第一个用于命令行,第二个用于浏览器访问,这里都设置为index.php
$phar->setDefaultStub(&#39;index.php&#39;, &#39;index.php&#39;);


Accédez ensuite à ce fichier yunkeBuild.php dans le navigateur, un fichier yunke.phar sera généré à ce moment, la structure du répertoire racine du serveur est la suivante :


project
yunkeBuild.php
yunke.phar


Il s'agit du processus le plus simple pour générer un fichier d'archive phar. Pour plus d'informations, veuillez consulter le site officiel. Il convient de noter ici que si le projet n'a pas une seule entrée d'exécution, il n'est pas approprié d'utiliser le fichier d'archive phar <.>

Utilisation des archives phar :

Nous créons un fichier index.php dans le répertoire racine du serveur pour montrer comment utiliser le fichier phar créé ci-dessus. Le contenu est le suivant :


.
<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/8
 * Time: 9:33
 */
require "yunke.phar";
require "phar://yunke.phar/Lib.php";
yunke();

S'il n'y a que la première ligne dans le fichier index.php, ajoutez le code suivant exactement de la même manière que lorsque vous n'utilisez pas de fichier d'archive :


require "project/index.php";

S'il n'y a pas de deuxième ligne, alors yunke() sur la troisième ligne indiquera qu'il n'est pas défini, on peut donc voir que lorsqu'on demande un fichier phar, tous les fichiers qu'il contient ne sont pas importés, mais seul le fichier d'exécution d'entrée est importé Cependant, dans les projets réels, il s'agit souvent d'importer d'autres fichiers qui doivent être utilisés dans ce fichier d'entrée. Dans cet exemple, le fichier d'exécution de l'entrée est project/index.php

.

Extraction et restauration des fichiers phar :

Parfois, nous sommes curieux de connaître le code source des fichiers contenus dans le phar. À ce stade, nous devons restaurer le fichier phar. Si nous y jetons juste un coup d'œil, nous pouvons utiliser certains outils IDE, tels que phpstorm. 10, vous pouvez l'ouvrir directement. Si vous devez le modifier, vous devez l'extraire pour la démonstration, nous téléchargeons un composer.phar et le plaçons dans le répertoire du serveur, et créons un fichier get.php dans le répertoire racine avec. le contenu suivant :


<?php
/**
 * Created by yunke.
 * User: yunke
 * Date: 2017/2/9
 * Time: 19:02
 */
$phar = new Phar(&#39;composer.phar&#39;);
$phar->extractTo(&#39;composer&#39;); //提取一份原项目文件
$phar->convertToData(Phar::ZIP); //另外再提取一份,和上行二选一即可

用浏览器访问这个文件,即可提取出来,以上列子展示了两种提取方式:第二行将建立一个composer目录,并将提取出来的内容放入,第三行将产生一个composer.zip文件,解压即可得到提取还原的项目文件。

补充:

1、在部署phar文件到生产服务器时需要调整服务器的配置,避免当访问时浏览器直接下载phar文件

2、可以为归档设置别名,别名保存在归档文件中永久保存,它可以用一个简短的名字引用归档,而不管归档文件在文件系统中存储在那里,设置别名:


$phar = new Phar(&#39;lib/yunke.phar&#39;, 0);
$phar->setAlias ( "yun.phar");


设置别名后可以如下使用:


<?php
require "lib/yunke.phar";
require "phar://yun.phar/Lib.php"; //使用别名访问归档文件
require "phar://lib/yunke.phar/Lib.php"; //当然仍然可以使用这样的方式去引用


如果在制作phar文件时没有指定别名,也可以在存根文件里面使用Phar::mapPhar('yunke.phar');指定

3、归档文件中有一个存根文件,其实就是一段php执行代码,在制作归档时可以设置,直接执行归档文件时,其实就是执行它,所以它是启动文件;在脚本中包含归档文件时就像包含普通php文件一样包含它并运行,但直接以phar://的方式包含归档中某一个文件时不会执行存根代码, 往往在存根文件里面require包含要运行的其他文件,对存根文件的限制仅为以__HALT_COMPILER();结束,默认的存根设计是为在没有phar扩展时能够运行,它提取phar文件内容到一个临时目录再执行,不过从php5.3开始该扩展默认内置启用了

4、制作的phar文件不能被改动,因此配置文件之类的文件需要另外放置在归档文件外面

5、mapPhar函数:这个函数只应该在stub存根代码中调用,在没有设置归档别名的时候可以用来设置别名,打开一个引用映射到phar流。

大家学会了吗?

相关推荐:

php 中phar包的使用教程详解

php中phar包的使用教程

分享PHP中phar包的使用实例教程

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn