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

phar文件是一个特殊的php文件,可以理解为一个压缩包,但是常见的压缩工具并不能打开这个phar文件。用记事本打开这个phar文件的话,你就会发现phar文件是由明文的php文件和尾部的一些乱码所组成的。

苏南大叔:如何新建一个php的phar打包文件? - phar-create
如何新建一个php的phar打包文件?(图7-1)

phar文件把很多个php文件合N为1,然后留出一个虚拟的入口文件,来加载其他的虚拟文件。这N合1整体作为库文件,提供给其它php代码作为一个独立的功能模块。最著名的例子:composer.phar就是作为phar文件进行分发的。

在本文中,苏南大叔将要讲述:如何新建一个phar文件。

开启php.iniphar相关设置

本文的目的是创建一个phar文件,这种phar文件的创建,需要开启一个特殊php.ini选项。然而phar的使用,并不需要开启这个选项,默认就是可以使用phar文件的。所以,如果您的目的并不是创建phar文件的话,就无需理会本项内容。

我们需要设置phar.readonlyoff,或者为0。这个项目的默认值是on

phar.readonly = Off

苏南大叔:如何新建一个php的phar打包文件? - 001
如何新建一个php的phar打包文件?(图7-2)

如果项目phar.readonly没有开启的话,试图创建一个phar文件时,就会得到如下错误提示:

Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Cannot write to archive - write operations restricted by INI setting'

苏南大叔:如何新建一个php的phar打包文件? - 000
如何新建一个php的phar打包文件?(图7-3)

如果您设置好了这个项目,您可以在phpinfo里面看到如下的截图。

苏南大叔:如何新建一个php的phar打包文件? - 002
如何新建一个php的phar打包文件?(图7-4)

下面的是mac系统下,相关设置截图。

苏南大叔:如何新建一个php的phar打包文件? - 099
如何新建一个php的phar打包文件?(图7-5)

打包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'));

苏南大叔:如何新建一个php的phar打包文件? - 009
如何新建一个php的phar打包文件?(图7-6)

代码解释

  • new Phar(<path_and_name.phar>),定义最终要生成的文件路径及名称。当然,如果路径不存在的话,是会报错的,并不会自动创建路径文件夹,这个需要注意。其他的教程里面,您可能会看到三个参数。但是这里,本demo中,一个就足够用了。
  • buildFromDirectory(string $base_dir [, string $regex ]),因为本例中,是从真实目录加工生成的最终文件,所以这里使用的是这个函数,$base_dir,源码目录。$regex,对源码目录里面的源码,有选择性的加载。个人认为,没有太大的必要使用$regex。放在目录里面的,当然是想打包进去的了。http://doc.php.sh/zh/phar.buildfromdirectory.html
  • compressFiles(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.html
  • setStubcreateDefaultStub,设置存根。其实就是苏南大叔说的供外部隐式调用的文件。这个文件,存在着两个版本,一个是供cli调用的(最常见的require模式,不单指cli),另外一个是供webphar调用的。但是,一般来说,就仅仅设置一个文件即可。关于这个web版本的设置项的问题,我们以后再仔细研究。http://doc.php.sh/zh/phar.createdefaultstub.htmlhttp://doc.php.sh/zh/phar.setstub.html 。当然,如果没有设置这个存根文件的话,默认寻找的文件就会是index.php

效果截图

如果一切顺利的话,您就可以拿到我们的第一个phar文件了。然后就可以愉快的拿着phar文件,提供给大家做功能模块了。更多信息,请点击这里查看:http://doc.php.sh/zh/class.phar.html

苏南大叔:如何新建一个php的phar打包文件? - 003
如何新建一个php的phar打包文件?(图7-7)

值得说明的是:如果你增删了源目录中的文件,然后重启利用上述脚本打包phar的话。增加的文件会添加进去,而删除的文件依然会存在。这显示可能不是你想要的,所以,你可以考虑一下,在生产phar的脚本前,增加个unlink函数。

@unlink("phar.phar");
$phar = new Phar('phar.phar');
//....

结束语

苏南大叔认为:phar文件是php的一个流行发展趋势。虽然,目前来说,还没有引起大规模的使用,但是其便利性是非常显而易见的。所以,苏南大叔有理由认为:phar文件应该代替那些庞大而复杂的库文件而出现。

更多有关phar文件的更多经验文章,请点击这里:https://newsn.net/tag/phar/

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

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

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

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