『PHP』phar文件详解_phar文件格式_调用phar类方法生成phar文件
2021/9/4 22:06:16
本文主要是介绍『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是<?php __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文件的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享