本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规。大家都是程序员,不要闹得不开心。

在前几篇phar经验文章中,我们知道构建一个phar文件,需要指定phar的入口存根文件,而这个存根文件默认是index.php,但是可以创建两个不同的存根文件,为什么需要两个不同的存根文件呢?本篇文章中,苏南大叔将要讲述,这两个不同的存根文件的不同所在,也就是phar和webphar的区别,涉及函数是:createDefaultStubsetStub

苏南大叔:phar和webphar的入口区别 - webphar
phar和webphar的入口区别(图4-1)

前言

本篇文章的基础文章是:https://newsn.net/say/php-phar-create.html ,如果您还没有阅读过这篇文章,建议您先看看这篇文章里面,讲述的创建一个phar文件的相关经验。

创建的phar文件,可以做为一个phar文件供其他其它php代码require或者include,这个时候,就是普通的phar模式。当通过地址url,浏览这个phar文件的时候,这个时候,访问的是这个phar文件下面的作为webphar的存根文件。这个时候,就是webphar模式了。所以说,其实是同一个文件,只不过使用的方式不同,所以出了两个概念。

延伸阅读:https://doc.php.sh/zh/phar.createdefaultstub.html ,官方的这个说明中,第一个参数cli.php太具有迷惑力,实际上cli.php可不一定用在命令行里面的,普通的require("phar.phar")的时候,都是走cli.php这条通道的。

对比图

我们的范例phar文件中,有个lib.php用于createdefaultstub的第一个参数,即最常见的require模式。还有个index.php用于webphar模式。

苏南大叔:phar和webphar的入口区别 - phar_source
phar和webphar的入口区别(图4-2)

我们稍稍修改一下createDefaultStub函数的参数。

build.php

//...
$phar->setStub($phar->createDefaultStub('lib.php','index.php'));
//...

demo.php

include "phar.phar";

这个demo.php,无论是通过url访问,还是通过命令行模式执行,都加载执行的是lib.php这个入口。

苏南大叔:phar和webphar的入口区别 - require_lib
phar和webphar的入口区别(图4-3)

而通过url访问phar文件的时候,才是执行的webphar模式下的index.php。注意:这种情况下,一般来说,都是需要配置服务器nginx或者apache的,具体请参见苏南大叔的前几篇文章。

苏南大叔:phar和webphar的入口区别 - webphar
phar和webphar的入口区别(图4-4)

结论

对比图非常明显的显示了两者的区别,所以不要单纯的学习网上流传的教程,把两者设置为同一个入口,两者是有不同的使用场景的。只不过,场景比较罕见而已。

更多有关phar相关经验文章,请点击苏南大叔的文章。https://newsn.net/tag/phar/

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