php 除-PHP开发常识:Phar是什么?

2023-08-29 0 6,492 百度已收录

对于 Web 应用程序开发,如果不使用正确的工具,开发过程可能会困难且痛苦。 如果你以前开发过Java程序,相信你一定知道Jar文件(Jar是JavaARchive的缩写)。 一个应用程序,包括所有可执行和可访问的文件,被打包到一个 JAR 文件中,使得部署过程非常简单。

PHAR(“PhpARchive”)是类似于 PHP 中的 JAR 的包文件。 如果您使用的是PHP5.3或更高版本,那么默认支持Phar后缀文件,无需任何其他安装即可使用。

如果您以前没有使用过 Phar 文件,本文档将介绍这些文件的一些重要功能。 希望您能发现 Phar 是一项非常有用的技术,可以为您带来更快、更好的 PHP 开发和部署体验。

PHAR 文件的默认状态是只读的,无需配置即可使用 Phar 文件。 部署非常方便。 由于我们现在需要创建自己的 Phar 文件,因此我们需要允许写入 Phar 文件,这需要更改 php.ini

打开php.ini,找到phar.readonly命令行,修改为:

phar.readonly = 0

现在,我们可以将 PHP 应用程序打包成 Phar 文件。

我们的第一个 PHAR 文件

首先,我将按照规则创建应用程序的目录结构,就像这样:

PHAR文件会被放置在build目录下,这样可以防止它与源代码程序混合在一起。 src 是我们的 PHP 源代码。

index.php将是我们应用程序的入口程序,common.php可以放置应用程序需要的一些通用代码,config.ini是我们的配置文件。

index.php 看起来像这样:

<?php
require_once "phar://myapp.phar/common.php";
$config = parse_ini_file("config.ini");
AppManager::run($config);

common.php 看起来像这样:

<?php
class AppManager
{
    public static function run($config) {
         echo "Application is now running with the following configuration... ";
         var_dump($config);
     }
}

而config.ini的内容是这样的:

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

php 除-PHP开发常识:Phar是什么?

创建PHAR文件

在我们的 PHP 应用程序目录中,我们需要一个脚本来创建 Phar 文件。 我们将其命名为create-phar.php,放在myapp的根目录下,并在其中添加以下代码:

<?php
$srcRoot = "~/myapp/src";
$buildRoot = "~/myapp/build";
 
$phar = new Phar($buildRoot . "/myapp.phar", 
  FilesystemIterator::CURRENT_AS_FILEINFO |       FilesystemIterator::KEY_AS_FILENAME, "myapp.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");

打开命令行窗口,切换到myapp目录,运行命令:

aabouzekry@platinum:~/myapp$ php create-phar.php

运行里面的命令后,您将在构建目录中找到一个 myapp.phar 文件,以及 config.ini 的副本。 将这两个文件复制到WEB服务器的服务根目录(eghtdocs)中。

我们可以直接访问 Phar 打包的应用程序,但这需要对 Web 服务器进行额外配置,以将 Phar 文件发送到正确的 PHP 解析器。 另一种方法是创建一个包含此 Phar 文件的运行脚本。

在网络服务器的根目录中创建一个名为 run.php 的 PHP 脚本:

<?php
require "myapp.phar";

这段代码的作用是让你免去配置web服务器直接解析Phar文件的麻烦。 如果您的应用程序使用共享虚拟主机,并且您没有配置网络服务器的权限,那么这些方法是一个完美的解决方案。

创建 run.php 后,我们的网络服务器的根目录将如下所示:

打开浏览器,将地址指向run.php,您可以看到以下输出:

Phar 的工作原理

让我们回顾一下 create-phar.php 中的代码来了解每段代码的作用。 首先看一下这些行:

<?php
$phar = new Phar($buildRoot . "/myapp.phar", 
        FilesystemIterator::CURRENT_AS_FILEINFO |
        FilesystemIterator::KEY_AS_FILENAME, "myapp.phar");

创建一个新的Phar对象一般需要三个参数。 第一个参数是 phar 文件的路径。 除了通过它创建Phar文件之外,您还可以对现有的Phar文件进行操作。

第二个参数是设置Phar对象如何处理文件。 Phar对象继承了PHPRecursiveDirectoryIterator对象,这个参数直接传递给父类。 这里提供的值是RecursiveDirectoryIterator的默认值,可以满足当前的需求。

第三个参数是Phar文件的别名,内部引用Phar文件时使用。 也就是说,Phar内部文件的相互包含需要显式使用这个别名。 比如前面的index.php引用common.php就是这些方法。

<?php
require_once "phar://myapp.phar/common.php";

创建 Phar 对象后,index.php 和 common.php 将添加到 Phar 文件中。 Phar对象是一个链表,file_get_contents()方法将每个文件的内容读取到链表中。 上面可以添加很多文件,但是如果考虑添加大量文件,例如整个目录中的文件,可以考虑使用更方便的 buildFromDirectory() 方法。

<?php
$phar->buildFromDirectory("/path/to/dir",'/.php$/');

buildFromDirectory()的第一个参数是目录的路径; 第二个参数是可选的,使用正则表达式来过滤文件类型。 如果必须包含目录中的所有文件,则可以忽略此参数。

setStub() 用于创建存根文件,存根文件用于告诉 Phar 加载时要做什么。

最后php 除,将 config.ini 从 src 复制到 build 目录。

php 除-PHP开发常识:Phar是什么?

存根文件

运行 Phar 文件时php 除,存根文件用作元文件来初始化 Phar,并告诉 Phar 文件在调用时要做什么。 在我们的例子中,使用了createDefaultStub()方法,生成的默认存根文件包含以下代码:

<?php
Phar::mapPhar();
include "phar://myapp.phar/index.php";
__HALT_COMPILER();

createDefaultStub()方法中默认创建的存根文件的内容非常简单。 Phar::mapPhar()用于分析Phar文件的元数据并对其进行初始化。 需要在存根文件末尾调用 __HALT_COMPILER() 方法,该方法后不能留空格。 __HALT_COMPILER() 将立即停止 PHP 的运行,以防止包含的文件在该方法之后被执行。 这是 Phar 所必需的,没有它 Phar 将无法正常运行。

此外,我们还可以创建自己的存根文件来执行自定义初始化过程,加载自定义文件如下:

<?php
$phar->setStub(file_get_contents("stub.php"));

Phar 文件的一些陷阱

如果您开发的通用或可引用程序需要被多个项目使用,将其打包成 Phar 文件是一个无故障的解决方案。 Phar文件经过高度优化,其执行效率与普通文件相比并不弱,因此您无需担心效率问题。

但需要注意的是,Phar文件的使用有一些限制。 以下是一些提示,可以帮助您更好地理解它:

总结

Phar可以为我们在打包和部署PHP应用程序时省去很多麻烦,推荐大家尝试一下。 本文仅介绍 Phar 的一些主要概念,包括如何创建 Phar、包含文件、介绍存根文件的功能以及如何访问 Phar 中的文件。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 除-PHP开发常识:Phar是什么? https://www.wkzy.net/game/182295.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务