【相关学习推荐:php编程(视频)】
构建PHP扩展
你已经知道如何去编译PHP本身,下一步我们将编译外部扩展。我们将讨论扩展的构建过程和可用的编译选项。
载入共享扩展
在前一个章节你已经知道,PHP 扩展既能构建成静态库也可以构建成动态库(.so
)。大多数静态库是与 PHP 捆绑在一起编译的,动态库可以显式地传递参数 --enable-EXTNAME=shared
或 --with-EXTNAME=shared
给 ./configure
。
静态扩展默认是可用的,动态库需要增加 extension 或者 zend_extension 的 ini 配置。俩者可以是绝对路径,也可以是相对路径。
例如编译 PHP 扩展用项目的配置项:
~/php-src> ./configure --prefix=$HOME/myphp --enable-debug --enable-maintainer-zts --enable-opcache --with-gmp=shared
这个例子中 opcache 扩展和 GMP 扩展都被编译为位于 modules/
目录中的共享对象。 您可以通过更改extension_dir
或通过传递绝对路径来加载:
~/php-src> sapi/cli/php -dzend_extension=`pwd`/modules/opcache.so -dextension=`pwd`/modules/gmp.so # or ~/php-src> sapi/cli/php -dextension_dir=`pwd`/modules -dzend_extension=opcache.so -dextension=gmp.so
在 make install
步骤中,这两个 .so
文件会被移进 PHP 安装的扩展目录,你使用 php-config --extension-dir
命令可能可以找到它。对于上面的构建选项,它将是 /home/myuser/myphp/lib/php/extensions/no-debug-non-zts-MODULE_API
。这个值也是 extension_dir
配置选项的默认值,所以你无需明确地指定它,就可以直接加载进扩展:
~/myphp> bin/php -dzend_extension=opcache.so -dextension=gmp.so
这给我们留下了一个问题:你应该使用哪种机制?共享对象使你有一个基本的 PHP 二进制文件并通过 php.ini 加载其他扩展。发行版通过原始的 PHP 软件包和将扩展作为单独的软件包分发来利用此功能。另一方面,如果你编译自己的 PHP 二进制文件,则可能不需要这个,因为你已经知道需要哪些扩展。
根据经验,你将对 PHP 本身捆绑的扩展使用静态链接,并将共享扩展用于其他地方。原因很简单,就像你稍后看到的,构建外部扩展为共享对象的更容易(或至少减少了侵入性)。另一个好处是你可以在不用重新构建 PHP 的情况下更新扩展。
注意
如果你需要有关扩展和 Zend 扩展之间差异的信息,你可以查阅专门章节。
从 PECL 安装扩展
PECL,PHP 扩展社区库,提供了大量的 PHP 扩展。当扩展从主 PHP 发行版中删除,它们通常还在 PECL中。同样,现在与 PHP 捆绑一起的许多扩展以前都是 PECL 扩展。
除非你在 PHP 构建的配置步骤指定 --without-pear
,否则 make install
将PECL 作为 PEAR 的一部分下载并安装。你可以在 $PREFIX/bin
目录下找到 pecl
脚本。现在安装扩展很简单,就像运行 pecl install EXTNAME
一样,例如:
~/myphp> bin/pecl install apcu
该命令将下载、编译并安装 APCu 扩展。结果会是 apcu.so
文件在扩展目录下,可以来&源gao@dai!ma.com搞$代^码%网搞gaodaima代码通过传递
extension=apcu.so
配置选项来加载此文件。
虽然 pecl install
对终端用户非常方便,但扩展开发人员对它没什么兴趣。在下面,我们将会说明两种手动构建扩展的方式:通过将其导入主要的 PHP 源码树(允许静态链接)或通过外部构建(仅共享)。