php中有两个概念:PEAR和PECL。这两个概念关系紧密,却又有着本质的区别。今天就试着把它们的关系讲讲清楚。
基本概念
PEAR的概念原文如下:
PEAR(PHP Extension and Application Repository) is a framework and distribution system for reusable PHP components.
我的理解是:PEAR是一个php可重用组件的框架和发布系统。
而PECL的概念原文如下:
PECL(The PHP Extension Community Library) is a repository for PHP Extensions, providing a directory of all known extensions and hosting facilities for downloading and development of PHP extensions.
大意是:PECL是一个管理php扩展的仓库。
除了这个概念,在PECL的官网主页上还有这么一句话:
The packaging and distribution system used by PECL is shared with its sister, PEAR.
直译为:PECL,和它的姊妹PEAR共同使用一个打包和发布系统。
二者关系
内容范围
在我看来,PECL更倾向于是php的扩展库。我们都知道php的扩展是使用c语言写的,在php编译之后,如果想动态的添加扩展,就只能单独编译,然后以动态链接库的形式加入php中。而无论是从概念,或是PECL中的内容来看,它都是php的扩展库。
回过头来看PEAR,它强调的是可重用组件,原文是extension and application。那在这里,我理解分为两个部分:
- extension:由C语言编写的php扩展(包括编译php时加入的和编译后以动态库形式加入的);
- application:有php语言自身编写的可重用包,比如说某些框架(CI)、某些DB操作类库(DBA)等等;
不过需要注意一点,我们一般是用的PEAR只包含第二部分application,而extension是放在PECL中的。
但是从概念所定义的范围上来说,我更倾向是PEAR包含PECL。
框架系统
从上文二者的定义可以看出:
- PEAR明确指出是一种php可重用代码的框架和发布管理系统;
- 而PCEL则是说,和PEAR共同使用一个打包和发布系统;
由此可见,很大可能这个公用的框架系统是由PEAR率先使用的,然后PECL由于某些原因,复用了这一套框架系统。
命令源码
我在我的mac上分别安装了这两个命令(pear 和 pecl),并对比了命令中的内容,不同之处在于:
在pear的最后一行为:
exec $PHP -C ··· -d open_basedir="" ··· -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.php "$@"
而在pecl的最后一行为:
exec $PHP -C ··· $INCDIR/peclcmd.php "$@"
我将其中相同的部分省略,可以看出,除了2个配置项之外,最大的不同在于:$INCDIR/
之后的文件。pear用的是pearcmd.php,而pecl用的是peclcmd.php。接着我们来对比下这两个文件。通过对比发现:peclcmd.php仅仅是定义了个PEAR_RUNTYPE
之后,直接调用了pearcmd.php。
define('PEAR_RUNTYPE', 'pecl'); @ini_set('allow_url_fopen', true);
require_once 'pearcmd.php';
这说明了什么我就不用多说了…
综上,我更倾向于:PEAR在概念上包含了两个部分,一个是PEAR真正的内容(由php代码编写的application)和PECL(由C语言编写的扩展)。PEAR概念上包含PECL,但在内容上和PECL互补,共同构成了PEAR的概念。但这仅仅是我个人的看法,其中可能也有很多我不知晓的渊源而导致事实并非如此。写此文章,也只是帮助我加深对两个概念的理解而已。
如果有任何不当之处,欢迎指出。