简单了解Phar代码打包工具的使用Phar是PHP5之后提供的一个类似于代码打包的工具。本质上它是想按照Java的Jar文件形式进行代码打包,但是由于PHP本身不会编译,所以这个Phar实际上是将代码原样打包,没有编译。但是我们可以对打包好的Phar包进行压缩。另外,真正用过Phar包的人也少之又少,尤其是在Composer已经成为事实上的代码库标准的今天,Phar更是难求。但是,Composer安装包本身也是一个.phar包文件。主要是Phar形式的代码包安装不如Composer简单方便。另一方面,早期的程序员,尤其是LAMP/LAMP程序员,喜欢将开源代码拷贝过来,而不是直接使用一个工具包。毕竟,手头有源代码让我们更放心一些。事实上,即使Composer直接下载了源代码,我们也没有人真正看过它。与Phar相比,Composer最大的优势是代码的自动加载,另外就是标准的PSR命令空间和目录规范。这两个在Phar中是没有的,所以我们要想使用Phar包就必须require。虽然它已经过时了,但我们仍然简单地学习了解它。说不定以后我们会用得上,尤其是封装一些内部公共库函数的时候,Phar打包代码的方式还是很有用的。代码打包我们首先创建一个标准格式的目录树。在这个目录树中,src目录存放源代码,build目录用于存放生成的.phar代码包。//index.phpsetStub($phar->createDefaultStub("index.php"));复制($srcRoot."/config.ini",$buildRoot."/config.ini");代码并不复杂,主要是一个Phar类,这个类需要指定生成文件的目录和文件名,然后使用createDefaultStub()方法调用我们包的入口文件index.php,该方法用于创建指定的.phar文件存根。其实就是指定一个入口文件,就像Java中的main()方法入口一样。然后我们将config.ini文件复制到release目录build。然后使用命令行运行create-phar.php文件生成这组代码包。#php./create-phar.php用文本编辑器打开myphar.phar文件,我们会发现还是我们熟悉的PHP代码,拉到最下面,会发现index的内容.php和common.php已经编译到这个文件中。上面自动生成的代码是一些bootstrap或者pre-prepared语句,是Phar扩展为我们准备的。用户编写的所有源代码将位于该文件的底部。也就是说,你可以下载Composer的安装包,也就是.phar文件,看看里面都写了什么。接下来就是使用了,非常简单。$config=parse_ini_file("./myphar/build/config.ini");需要'./myphar/build/myphar.phar';Manager::run($config);//AAA//array(4){//["host"]=>//string(9)"localhost"//["db"]=>//string(6)"dbname"//["user"]=>//string(6)"myuser"//["pass"]=>//string(6)"dbpass"//}var_dump(Manager::ChineseMobile('13811111111'));var_dump(Manager::ChineseMobile('138111111112'));//bool(true)//bool(false)压缩能力前面说了,作为代码库,Phar早就被Composer打败了,但它可以用作一些安装包。Phar也是一个压缩工具。可以用来归档一些文件、文本、目录等。让我简单了解一下Phar是如何用于文本归档的。unlink('./my.phar');unlink('./my.phar.bz2');unlink('./my.phar.gz');$p=newPhar('./my.phar',0,'my.phar');$p['myfile1.txt']='hi1';$p['myfile2.txt']='hi2';$p1=$p->compress(Phar::GZ);$p2=$p->compress(Phar::BZ2);unset($p);$decompressPhar=newPhar('./my.phar',0,'my.phar');foreach($decompressPharas$file){//$file是返回的PharFileInfo对象var_dump($file->getFileName());var_dump($file->isCompressed());var_dump($file->isCompressed(Phar::BZ2));var_dump($file->isCompressed(Phar::GZ));var_dump($file->getContent());}echo'===================',PHP_EOL;//字符串(11)"myfile1.txt"//bool(false)//bool(false)//bool(false)//string(3)"hi1"//string(11)"myfile2.txt"//bool(false)//bool(false)//bool(false)//string(3)"hi2"首先我们还是实例化一个Phar类,然后像数组一样给它添加属性,所以,属性内容被打包到.phar文件中。直接看my.phar文件可以看到,myfile1.txt的两个属性直接写成一个文件存储,也就是说帮我们把文本转成文件,打包到my.phar压缩包文件。compress()方法是将当前Phar对象压缩存储为一定格式的文件。这里我们直接压缩Bzip2和GZ文件。调用该方法后,会直接生成对应的压缩文件。遍历Phar对象时生成的对象是PharFileInfo对象,它有很多类似于File的文件操作功能。您可以在官方文档中找到相关说明。假设我们遍历my.phar.gz,内容仍然可以正常输出,但是循环中的isCompressed()判断仍然会为false。文件没有压缩?事实上,我们还需要另一个函数来将所有文件压缩成统一的格式。$p=newPhar('./my.phar',0,'my.phar');$p->compressFiles(Phar::GZ);unset($p);$decompressPhar=newPhar('./my.phar.gz',0,'my.phar');foreach($decompressPharas$file){//$file为返回的PharFileInfo对象var_dump($file->getFileName());var_dump($file->isCompressed());var_dump($file->isCompressed(Phar::BZ2));var_dump($file->isCompressed(Phar::GZ));var_dump($file->getContent());}echo'===================',PHP_EOL;//字符串(11)"myfile1.txt"//bool(true)//bool(false)//bool(true)//string(3)"hi1"//string(11)"myfile2.txt"//bool(true)//bool(false)//bool(true)//string(3)"hi2"使用compressFiles()将整个.phar中的所有文件以统一格式压缩后,打印时isCompressed()会以相应格式返回true。数据格式Phar最后,如果只是为了打包压缩,我们不需要使用Phar类。Phar类的主要用途是封装可以运行的PHP源码,即它的createDefaultStub()方法非常重要。而如果我们只是打包普通文件,就不需要这个方法了。这时候我们可以使用另外一个PharData类来打包压缩数据。使用方法与Phar类完全一样。同时PharData类可以直接打包成tar等文件。$p=newPharData('./myData.tar');$p['myfile1.txt']='hi1';$p['myfile2.txt']='hi2';foreach($pas$file){var_dump($file->getFileName());var_dump($file->isCompressed());var_dump($file->isCompressed(Phar::BZ2));var_dump($file->isCompressed(Phar::GZ));var_dump($file->getContent());}echo'====================',PHP_EOL;//string(11)"myfile1.txt"//bool(false)//bool(false)//bool(false)//string(3)"hi1"//string(11)"myfile2.txt"//bool(false)//bool(false)//bool(false)//string(3)"hi2"说实话,Phar确实是一个冷门项目,但在某些情况下却非常有用。比如它虽然在代码包领域输给了Composer,但是它也可以成为Composer的安装包,也就是说没有Phar就无法安装Composer。作为一种压缩工具,它虽然拥有强大的力量,但却很少被使用。所以,我们还是以理解为目的来使用它。如果我们觉得有些场景非常适合,我们也可以进行深入的研究,并在我们的实际项目中使用。毕竟,它是PHP的一部分,不需要任何编译、安装或其他支持。这是非常本土的。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/%E7%AE%80%E5%8D%95%E4%BA%86%E8%A7%A3Phar%E4%BB%A3%E7%A0%81%E6%89%93%E5%8C%85%E5%B7%A5%E5%85%B7%E7%9A%84%E4%BD%BF%E7%94%A8.php参考文档:https://www.php.net/manual/zh/book.phar.phphttps://www.webhek.com/post/packaging-your-php-apps-with-phar.htmlhttp://www.mamicode.com/info-detail-888559.html============各媒体平台均可搜索【硬核项目经理】
