phar简介

phar,全称为PHP Archive,phar扩展提供了一种将整个PHP应用程序放入.phar文件中的方法,以方便移动、安装。.phar文件的最大特点是将几个文件组合成一个文件的便捷方式,.phar文件提供了一种将完整的PHP程序分布在一个文件中并从该文件中运行的方法。

可以将phar文件类比为一个压缩文件

phar demo

注意:默认phar扩展是只读模式,需要手动配置php.ini中phar.readonly= Off

无法用ini_set修改
『踩坑记录』PHP-使用ini_set()无法修改phar.readonly

<?php$phar = new Phar('demo.phar');$phar['demo.php'] = '<?php echo 1;?>';include('phar://./demo.phar/demo.php'); //1
?>

使用phar://伪协议可以读取phar文件

源码如下:

phar文件格式

PHP: Ingredients of all Phar archives, independent of file format - Manual

stub

stub是phar文件的文件头,格式为...<?php ...;__HALT_COMPILER();?>,…可以是任意字符,包括留空,且php闭合符与最后一个分号之间不能有多于一个的空格符。另外php闭合符也可省略。

包含在php代码块中的语句在phar文件被包含时被执行

<?php$phar = new Phar('demo.phar');$phar->setStub('<?php echo \'in stub!\';__HALT_COMPILER();?>');include('phar://demo.phar');  // in stub!
?>

最短省略闭合符的stub是__HALT_COMPILER();?>

manifest describing the contents

该区域存放phar包的属性信息,允许每个文件指定文件压缩、文件权限,甚至是用户定义的元数据,如文件用户或组。

PHP: Phar File Format - Manual

file contents

被压缩的用户添加的文件内容

[可选]signature

可选,phar文件的签名,允许的有MD5, SHA1, SHA256, SHA512和OPENSSL

如何生成phar文件?

实例化phar类

phar类提供对phar文件的操作

通常只需传入文件名

<?php$phar = new Phar('demo.phar');
?>

创建stub

创建stub主要有2种方法:

自定义创建

调用类方法Phar::setStub($string)为实例创建自定义stub

<?php$phar = new Phar('demo.phar');$phar->setStub('<?php echo \'in stub!\';__HALT_COMPILER();?>');include('phar://demo.phar');  // in stub!
?>

使用默认stub

调用类方法Phar::setDefaultStub()为实例设置默认stub,使用方法Phar::getStub()获取实例的stub

<?php$phar = new Phar('demo.phar');$phar->setDefaultStub();print_r($phar->getStub()); // 2, 'c' => 'text/plain', 'cc' => 'text/plain', ...
?>

如果缺省创建stub,PHP会使用默认stub

<?php$phar = new Phar('demo.phar');$phar['demo.txt'] = 'demo';print_r($phar->getStub()); // 2, 'c' => 'text/plain', 'cc' => 'text/plain', ...
?>

[可选]添加自定义元数据

manifest数据会根据配置信息自动生成,此步骤在于添加自定义元数据(meta-data),因此是可选的

过大的元数据会引起性能问题

调用类方法Phar::setMetadata()为实例设置默认stub,使用方法Phar::getMetadata()获取实例的stub

<?php$phar = new Phar('demo.phar');$metadata = array('demo'=>1);$phar->setMetadata($metadata);print_r($phar->getMetadata()); // Array ( [demo] => 1 )
?>

[可选]添加文件

添加文件有几种方法:

手动选择添加已有文件

调用类方法Phar::addFile($filepath,$localpath=?)添加文件,参数是文件绝对路径和(可选)存储到phar的相对路径

<?php$phar = new Phar('demo.phar');$phar->addFile('test.php');include('phar://demo.phar/test.php') // in test.php
?>

以字符串添加文件内容

调用类方法Phar::addFromString($localpath,$contents)以字符串形式添加文件

<?php$phar = new Phar('demo.phar');$phar->addFromString('test.php','<?php echo \'in test.php\'?>');include('phar://demo.phar/test.php'); // in test.php
?>

添加空目录

调用类方法Phar::addEmptyDir($dirname)添加空目录,使用方法Phar::getContent()获取文件结构

<?php$phar = new Phar('demo.phar');$phar->addEmptyDir('test'); // demo.phar/test/
?>

手动选择添加已有目录

调用类方法Phar::buildFromDirectory($dir,$pattern = "")添加整个目录

<?php$phar = new Phar('demo.phar');$phar->buildFromDirectory('test'); // test.php in test/include('phar://demo.phar/test/test.php'); // in test/test.php
?>

从迭代器添加

调用类方法Phar::buildFromIterator($iterator, ?$baseDirectory = null)从迭代器添加

PHP: Phar::buildFromIterator - Manual

[可选]手动添加支持的签名

缺省会自动签名,基于SHA-1算法

<?php$phar = new Phar('demo.phar');$phar->addFromString('test.php',1);
print_r($phar->getSignature()); // Array ( [hash] => F... [hash_type] => SHA-1 )
?>

调用类方法Phar::setSignatureAlgorithm(int $algo, ?string $privateKey = null)添加签名

PHP: Phar::setSignatureAlgorithm - Manual

[可选]提高性能

由于每次对phar文件的操作都会引起物理存储上的整个phar文件的重新创建,对于处理包含大量文件的phar文件会带来性能问题。因此,使用缓冲区进行修改,完毕后一并写入物理存储能够减少对物理存储上文件的重新创建,一次性写入从而达到提高性能的效果

PHP: Phar::startBuffering - Manual

在实例化phar类后,调用方法Phar::startBuffering()Phar::stopBuffering创建缓冲区,并在缓冲区进行创建、添加等操作

<?php$phar = new Phar('phar.phar');$phar->startBuffering();$phar->setStub('<? __HALT__COMPILER();?>');$phar->addFromString('test.php','<?php echo \'in test.php\'?>');$phar->stopBuffering();
?>

参考

PHP: Phar - Manual

『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件相关推荐

  1. Makefile文件详解一(怎么在Windows下使用Makefile文件)

    前言:如果熟悉在Linux开发的话,肯定知道Makefile文件的用处,它给我们带来很多的便利.在Linux系统下并不会像Windows那么多开发工具,在Windows下,只要在开发工具上点击一个按钮 ...

  2. linux /proc目录文件详解

    Linux中/proc目录下文件详解(一) /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化.命令proc ...

  3. schema约束文档与xml文件详解

    schema约束文档与xml文件详解 1.前言 2.schema约束文档(.xsd文件) 2.1 targetNameSpace 2.2官方文档与自定义文档的关系 2.3 声明名称空间 2.4 sch ...

  4. 附005.Docker Compose文件详解

    一 Docker Compose文件简介 compose文件使用yml格式,主要分为了四个区域: version:用于指定当前docker-compose.yml语法遵循哪个版本 services:服 ...

  5. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  6. Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

    http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...

  7. linux在当前目录下创建pic目录,Linux中/proc目录下文件详解

    文章转自: Linux中/proc目录下文件详解(一) ------------------------------------------------------------------------ ...

  8. C# 目录路径操作和读取文件详解

    C# 目录路径操作和读取文件详解 文章目录 C# 目录路径操作和读取文件详解 1.Path 类 操作目录路径 2. File 类使用 2.1创建,删除,复制,剪切移动文件 2.2 读取文件:ReadA ...

  9. GAZEBO 中 sdf文件详解

    转载自:https://blog.csdn.net/weixin_44900096/article/details/103017522 GAZEBO 中 sdf文件详解 木木木一 2019-11-11 ...

最新文章

  1. linux死机了怎么办?
  2. map语法获取index_复习Elasticsearch的基础语法(一)
  3. 《软件需求分析(第二版)》期中考试试题总结/复习资料
  4. 上下文保存 中断_从操作系统(Windows)的角度讨论中断和异常机制
  5. CodeReview 常见代码问题( 下 )
  6. 开源中国源码学习(八)——枚举类
  7. php mysql pod_php – 连接到同一pod中的MySQL容器
  8. 联想电脑Windows7系统重装方法,简单易上手
  9. 从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
  10. Android App 启动时显示正在加载图片(源码)
  11. 电路实验一阶电路误差分析_差动放大电路 | 电阻误差对共模抑制比的影响有多大?...
  12. 鸿蒙系统推广时间,鸿蒙系统将全面推广,目标覆盖3亿台设备,第三方IoT可达1亿台...
  13. 终于,“亚麻百货”也要来了!
  14. PS超简单的扣人像方法
  15. 使用pycharm去掉表格中的重复数据
  16. LCD液晶驱动芯片VK1625/VK1626可通过指令进人省电模式,附带参考电路图
  17. Thread.Sleep(0)的妙用
  18. PHP正则表达式判断手机号码是否合法
  19. 一篇文章读懂Armv8 AArch64
  20. IIC(I2C)协议详解

热门文章

  1. 通信系统中PSE、PoE和PD的含义
  2. 项目同时使用git和svn
  3. elasticsearch全文检索
  4. 请求https,X509证书信任管理器类,避免导证书
  5. 趣图:搞笑程序员表情包 | 这代码......辣眼睛.....
  6. 解决tyn表面磁盘满,而实际没有大文件的问题
  7. 书讯--Microsoft Windows Communication Foundation Step by Step
  8. Centos安装Certbot,免费https证书
  9. Internal Covariate Shift与Normalization
  10. (前端学习)07 使用vue框架制作购物车小球动画效果