如何新建一个php的phar打包文件?
发布于 作者:苏南大叔 来源:程序如此灵动~phar
文件是一个特殊的php文件,可以理解为一个压缩包,但是常见的压缩工具并不能打开这个phar
文件。用记事本打开这个phar文件的话,你就会发现phar
文件是由明文的php文件和尾部的一些乱码所组成的。
phar
文件把很多个php文件合N为1,然后留出一个虚拟的入口文件,来加载其他的虚拟文件。这N合1整体作为库文件,提供给其它php代码作为一个独立的功能模块。最著名的例子:composer.phar
就是作为phar
文件进行分发的。
在本文中,苏南大叔将要讲述:如何新建一个phar
文件。
开启php.ini
中phar
相关设置
本文的目的是创建一个phar
文件,这种phar
文件的创建,需要开启一个特殊php.ini
选项。然而phar
的使用,并不需要开启这个选项,默认就是可以使用phar
文件的。所以,如果您的目的并不是创建phar
文件的话,就无需理会本项内容。
我们需要设置phar.readonly
为off
,或者为0
。这个项目的默认值是on
phar.readonly = Off
如果项目phar.readonly
没有开启的话,试图创建一个phar
文件时,就会得到如下错误提示:
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Cannot write to archive - write operations restricted by INI setting'
如果您设置好了这个项目,您可以在phpinfo
里面看到如下的截图。
下面的是mac系统下,相关设置截图。
打包phar
phar
文件的创建,其实有几种方式。但是,通常来说,我们使用最常见的方式即可。即:正常编写所有文件,然后特别的编写一个入口文件,用于外部代码引用即可。这个入口文件,会隐式的被外部代码调用。从而将相关功能注入到外部环境之中。
我们创建好相关的要集成到phar
功能的代码目录及相关功能代码后,需要我们再次新建一个构建打包的php
代码。下面给出相关功能demo
,当然下面的代码,也会有很多的变形,但是下面的这段demo
,苏南大叔认为是最简单最好理解的。
$phar = new Phar('phar.phar');
//$phar->buildFromDirectory(__DIR__.'/phar/', '/\.php$/');
$phar->buildFromDirectory(__DIR__.'/phar/');
$phar->compressFiles(Phar::GZ);
$phar->setAlias("p.phar");
$phar->setStub($phar->createDefaultStub('lib.php'));
代码解释
new Phar(<path_and_name.phar>)
,定义最终要生成的文件路径及名称。当然,如果路径不存在的话,是会报错的,并不会自动创建路径文件夹,这个需要注意。其他的教程里面,您可能会看到三个参数。但是这里,本demo中,一个就足够用了。buildFromDirectory(string $base_dir [, string $regex ])
,因为本例中,是从真实目录加工生成的最终文件,所以这里使用的是这个函数,$base_dir,源码目录。$regex,对源码目录里面的源码,有选择性的加载。个人认为,没有太大的必要使用$regex
。放在目录里面的,当然是想打包进去的了。http://doc.php.sh/zh/phar.buildfromdirectory.htmlcompressFiles(int $compression)
,有两种压缩形式。苏南大叔个人认为,也没有啥大区别。可选项是:Phar::GZ
,Phar::BZ2
,当然还有个Phar::NONE
项目,移除压缩功能。http://doc.php.sh/zh/phar.compressfiles.html。不使用此方法的情况下,默认就是不压缩文件。使用压缩设置的文件,在还原的时候,很有可能得到的是乱码文件。这点将在解phar
的文章中有所提及。setAlias(string $alias)
,设置别名。就是给这个phar
文件包起一个别名,其实似乎也没有太大的用途。一个名字就蛮好的,大家觉得呢?如果不想要这个别名功能的话,不设置即可。http://doc.php.sh/zh/phar.setalias.htmlsetStub
和createDefaultStub
,设置存根。其实就是苏南大叔说的供外部隐式调用的文件。这个文件,存在着两个版本,一个是供cli
调用的(最常见的require
模式,不单指cli
),另外一个是供webphar
调用的。但是,一般来说,就仅仅设置一个文件即可。关于这个web版本的设置项的问题,我们以后再仔细研究。http://doc.php.sh/zh/phar.createdefaultstub.html , http://doc.php.sh/zh/phar.setstub.html 。当然,如果没有设置这个存根文件的话,默认寻找的文件就会是index.php
。
效果截图
如果一切顺利的话,您就可以拿到我们的第一个phar
文件了。然后就可以愉快的拿着phar
文件,提供给大家做功能模块了。更多信息,请点击这里查看:http://doc.php.sh/zh/class.phar.html 。
值得说明的是:如果你增删了源目录中的文件,然后重启利用上述脚本打包phar
的话。增加的文件会添加进去,而删除的文件依然会存在。这显示可能不是你想要的,所以,你可以考虑一下,在生产phar
的脚本前,增加个unlink
函数。
@unlink("phar.phar");
$phar = new Phar('phar.phar');
//....
结束语
苏南大叔认为:phar
文件是php
的一个流行发展趋势。虽然,目前来说,还没有引起大规模的使用,但是其便利性是非常显而易见的。所以,苏南大叔有理由认为:phar
文件应该代替那些庞大而复杂的库文件而出现。
更多有关phar
文件的更多经验文章,请点击这里:https://newsn.net/tag/phar/ 。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。