我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在上一篇文章中,苏南大叔和大家一起学习了phar文件的创建。在本篇文章中,苏南大叔将继续讲述phar文件的还原。因为我们大家已经知道了:phar文件其实就是一系列php(及其它类型)文件的结合体。

苏南大叔:如何解包还原一个phar文件? - phar-extact
如何解包还原一个phar文件?(图2-1)

所以,如果您拿到了一个phar文件后,肯定会很好奇,里面到底有些什么东西。那么本文的内容,就是为了您满足您的好奇心而准备的。当然,如果你想修改某个别人提供的phar文件的话,本文的内容也是你需要查看的。

解压无压缩的代码到文件夹

对于没有使用任何压缩手段的phar文件,使用下面的代码即可顺利解压出源代码到文件夹。文件夹是自动创建的。支持自动创建多层文件夹。这里的压缩手段,指的是创建phar文件时的函数方法compressFiles

$phar = new Phar('phar.phar');
//$phar->extractTo('phar2/source/');
$phar->extractTo('phar2/source/',null,true);

但是,如果参数不变,再次执行extractTo的时候,会提示错误,文件已经存在。这个时候,就需要设置extractTo的第三个参数$overwrite了,就是说是否覆盖原文件。而第二个参数$files可以是字符串,也可以是数组,用于指出解压的时候就解压哪几个文件。显然,这个参数顺序安排也是不合理的,显然$overwrite是最大的需求,而$files是其次需求,一般来说,用null来忽略掉这个$files参数的匹配项目。

注意: 但是上述代码对于使用compressFiles方法的phar文件来说,这就是个陷阱,掉进去之后,不要忘记挣扎几下。对于使用了压缩手段的phar文件来说,上述代码可以解压到相关文件,但是相关文件打开之后全部是乱码或者空白。

苏南大叔:如何解包还原一个phar文件? - 005
如何解包还原一个phar文件?(图2-2)

改进版解压代码

对于使用了压缩的phar文件的解压,这里有个不是太合适的poc。因为网上流传的代码中,都没有对压缩版的phar进行特殊处理。所以,在这里,苏南大叔认为可能也许是自己使用的php版本的bug,但是如果您也有类似的问题,不妨试试我这个不合适的poc。

$phar = new Phar('phar.phar');
foreach ($phar as $file) {
  file_get_contents($file);
}
$phar->extractTo('phar2', null, true); //提取一份原项目文件目录

就是在上述代码的基础上,增加了个遍历文件加file_get_contents,乱码就会正常。显然,这个poc不是很合适。但是,确实达到了我们的目的。当然,苏南大叔也实验了decompress()decompressFiles()这两个方法,并没有得到想要的结果。当然,如果您有什么好的见解,请留言给我。谢谢。

直觉上,这个extractTo函数调用过程中,可能存在着一个异步的解压过程。所以这个时机控制的不是很好,就导致了上述莫名其妙的问题了。

转格式为zip,再解压zip

这个代码仅仅是个途径参考,不如上边的方案来的直接。我们先把phar.phar,转化格式为phar.zip,然后再解压zip文件,得到代码。如果得到的代码还是乱码,那么请参照上一条解决方案。

newsn.net:这里是【评论】可见内容

相关链接

结论

phar代码的解包过程,似乎还是要费点周折的。在试图用其他函数方法的解包的时候,也有一些莫名其妙的问题存在。但是对于我们最基本的解包需求来说,本文的内容已经足够了。

如果您想了解更多有关phar的经验文章,欢迎您点击苏南大叔的更多经验文章。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    phar