您好,欢迎访问一九零五行业门户网

php如何使用Phar代码打包工具

本篇文章给大家介绍一下php使用phar代码打包工具的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
简单了解phar代码打包工具的使用phar 是在 php5 之后提供的一种类似于将代码打包的工具。本质上是想依照 java 的 jar 文件那种形式的代码包,不过本身由于 php 是不编译的,所以这个 phar 实际上就是将代码原样的进行打包,不会进行编译。但是我们可以对打包的 phar 包进行压缩操作。
另外,实际上使用过 phar 包的人非常少,特别是在 composer 已经成为事实代码库标准的今天,phar 就更加难觅踪影了。不过,composer 的安装包本身也是一个 .phar 的打包文件。
最主要的原因,一个是 phar 这种形式的代码包安装并不像 composer 一样的简单方便,另一方面,早期的程序员,特别是 lamp/lamp 的程序员,都喜欢去将开源的代码复制过来,而不喜欢直接使用一个工具包。
毕竟,源代码在手上让我们更加踏实一些。其实,就算是 composer 这样直接下载的就是源码,我们也从来没什么人真正的去翻过。而 composer 相比 phar 的最大优势,一个是代码的自动加载,另一个就是标准的 psr 命令空间和目录规范。这两个在 phar 中是没有的,所以我们要使用 phar 包都必须要 require 一下。
虽说已经过时了,但我们还是简单的来学习了解一下。说不定在什么时候我们就能用上,特别是封装一些内部的公用库函数时,phar 打包代码的这种方式还是非常有用的。
代码打包我们先按标准格式建立一个目录树。
在这个目录树中,src 目录存放源码,build 目录用来存放生成后的 .phar 代码包。
// index.php<?phprequire_once "phar://myphar.phar/common.php";
index.php 文件中,我们就是简单的引用 common.php 。注意这里使用的是 phar 伪协议来加载的 common.php 文件。关于伪协议的内容我们之前有过一篇文章进行过讲解。
<?php// common.phpclass manager{ public static function run($config){ echo "aaa", php_eol; var_dump($config); } public static function chinesemobile($mobile){ if(preg_match("/^1[34578]\d{9}$/", $mobile)){ return true; } return false; }}
common.php 文件中只是提供了一个类和两个简单的方法用来测试。run() 方法就是简单的输出打印的内容和传递过来的参数。chinesemobile() 方法则是我们提供的一个判断我们国内手机号的函数。
[database]host=localhostdb=dbnameuser=myuserpass=dbpass
config.ini 是一个配置文件,其实我们可以在 phar 的代码中直接的进行配置文件的读取,也可以让配置文件随代码一起 build 到指定的目录。
源码文件准备好了,接下来就是要准备打包的编译文件了。
// create-phar.php$srcroot = "./myphar/src";$buildroot = "./myphar/build"; $phar = new phar($buildroot . "/myphar.phar", filesystemiterator::current_as_fileinfo | filesystemiterator::key_as_filename, "myphar.phar");$phar["index.php"] = file_get_contents($srcroot . "/index.php");$phar["common.php"] = file_get_contents($srcroot . "/common.php");$phar->setstub($phar->createdefaultstub("index.php"));copy($srcroot . "/config.ini", $buildroot . "/config.ini");
代码并不复杂,主要是一个 phar 类,这个类要指定生成文件的目录,文件名,然后使用 createdefaultstub() 方法来调用我们包的入口文件 index.php ,这个方法是用于创建指定的 .phar 文件的存根。其实就是指定一个入口文件,就像 java 中的 main() 方法入口一样。
然后我们拷贝了 config.ini 文件到发布目录 build 中。
接着使用命令行运行这个 create-phar.php 文件,就能够生成这套代码包了。
# php ./create-phar.php
使用文本编辑器打开 myphar.phar 文件,我们会发现里面竟然还是我们熟悉的 php 代码,拉到最底下,更会发现 index.php 和 common.php 的内容都被编译在这个文件中了。上面的那些自动生成的代码就是一些引导或者前置准备语句,是 phar 扩展为我们准备好的内容,所有用户自己写的源码都会在这个文件的底部。也就是说,大家可以下载 composer 的安装包,也就是那个 .phar 文件看看里面都写了什么东西。
接下来就是使用了,这个就非常简单了。
$config = parse_ini_file("./myphar/build/config.ini");require './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 = new phar('./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 = new phar('./my.phar', 0 ,'my.phar');foreach($decompressphar as $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;// 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 类,然后我们给它像数组一样增加属性,这样,属性内容就被打包进了 .phar 文件中。通过直接查看 my.phar 文件,我们可以看出,myfile1.txt 这两个属性直接被写成了文件进行保存了,也就是说,它帮我们将文本转化成文件并打包在了 my.phar 这个压缩包文件中了。
compress() 方法则是将当前的这个 phar 对象压缩存储为某个格式的文件。这里我们直接压缩了 bzip2 和 gz 文件。调用这个方法后直接就会生成对应的压缩文件。
phar 对象在遍历时产生的对象是 pharfileinfo 对象,它拥有很多类似于 file 的文件操作函数。大家可能在官方文档中找到相关的说明。
假设我们遍历 my.phar.gz ,内容依然可以正常输出,但循环中的 iscompressed() 判断都依然会是 false ,难道文件没有被压缩吗?其实,我们需要通过另一个函数来让所有文件都进行统一格式的压缩。
$p = new phar('./my.phar', 0 ,'my.phar');$p->compressfiles(phar::gz);unset($p);$decompressphar = new phar('./my.phar.gz', 0 ,'my.phar');foreach($decompressphar as $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;// string(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 = new phardata('./mydata.tar');$p['myfile1.txt'] = 'hi1';$p['myfile2.txt'] = 'hi2';foreach($p as $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
推荐学习:php视频教程
以上就是php如何使用phar代码打包工具的详细内容。
其它类似信息

推荐信息