IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件 -> 正文阅读

[PHP知识库]『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件

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知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 10:56:57  更:2021-09-06 10:58:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:23:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码