【相关学习推荐: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 文件在扩展目录下,可以通过传递 extension=apcu.so 配置选项来加载此文件。
虽然 pecl install 对终端用户非常方便,但扩展开发人员对它没什么兴趣。在下面,我们将会说明两种手动构建扩展的方式:通过将其导入主要的 php 源码树(允许静态链接)或通过外部构建(仅共享)。
添加扩展到 php 源码树
第三方扩展和捆绑在 php 的扩展之间没有根本上的区别。因此你可以通过复制外部扩展到 php 源码树,并和通常的构建过程一样来构建。我们以apcu 作为例子来演示。
首先,你要把扩展的源代码放到 php 源码树的 ext/extname 目录。如果扩展可通过 git 获得,就像从 ext/ 中克隆仓库一样简单:
~/php-src/ext> git clone https://github.com/krakjoe/apcu.git或者你也可以下载源码压缩包并解压它:
/tmp> wget http://pecl.php.net/get/apcu-4.0.2.tgz/tmp> tar xzf apcu-4.0.2.tgz/tmp> mkdir ~/php-src/ext/apcu/tmp> cp -r apcu-4.0.2/. ~/php-src/ext/apcu该扩展会包含一个 config.m4 文件,该文件指定autoconf文件使用的特定扩展构建指令。 为了将它们包含在 /configure 脚本,你必须再次运行 ./buildconf。为了确保配置文件已经重新生成,建议事先删除它:
~/php-src> rm configure && ./buildconf --force现在你可以使用 ./config.nice 脚本将 apcu 添加到你的现有配置,或者从全新的配置行开始:
~/php-src> ./config.nice --enable-apcu# or~/php-src> ./configure --enable-apcu # --other-options最后,运行 make -jn 执行实际的构建。由于我们没有使用 --enable-apcu=shared,该扩展已经静态链接到 php 库,即不需要额外的操作即可使用它。显然,你也可以使用 make install 去安装最后的二进制文件。
使用 phpize 构建扩展
还可以通过使用构建 php章节提及到的 phpize 脚本与 php 分开构建。
phpize 的作用与 ./buildconf 用于 php 构建的脚本相似:第一,通过$prefix/lib/php/build 复制文件导入 php 构建系统到你的扩展中。这些文件是 acinclude.m4(php 的 m4宏)、phpize.m4(它会在你的扩展中重命名为 configure.in 并包含主要的构建说明)和 run-tests.php。
然后 phpize 将调用 autoconf 生成 ./configure 文件,该文件可以自定义扩展构建。注意,没必要传递 --enable-apcu 给它,因为这是隐式假定的。相反,你应该使用 --with-php-config 指定你的 php-config 脚本路径:
/tmp/apcu-4.0.2> ~/myphp/bin/phpizeconfiguring for:php api version: 20121113zend module api no: 20121113zend extension api no: 220121113/tmp/apcu-4.0.2> ./configure --with-php-config=$home/myphp/bin/php-config/tmp/apcu-4.0.2> make -jn && make install当你构建扩展时,你应该总是指定 --with-php-config 选项(除非你只有一个全局的 php 安装),否则 ./configure 无法确定要构建的 php 版本和标志。指定 php-config 脚本也确保了 make install 将移动生成的 .so 文件(可以在 modules/ 目录找到)到正确的扩展目录。
由于在 phpize 阶段还复制了 run-tests.php 文件,因此你可以使用 make test(或显示调用 run-tests)运行扩展测试。
删除已编译对象的 make clean 也是可用的,并且允许你增量构建失败时强制重新构建扩展。 另外 phpize 提供了一个清理选项 phpize --clean。该命令将删除所有 phpize 导入的文件和通过 /configure 脚本生成的文件。
显示关于扩展的信息
php cli 二进制文件提供了几个选项来显示关于扩展的信息。你已经知道 -m,该命令会列出所有已经下载的扩展。你可以利用它来确定扩展是否正确下载了:
~/myphp/bin> ./php -dextension=apcu
买宿迁云服务器如何选择操作系统阿里云服务器怎么挂mt4如何查看chrome版本 chrome浏览器版本查看方法云服务器一般多少钱一年.id域名是哪国的 .id域名未来值得去投资么域名已经解析可访问时提示没绑定这个服务器的白名单是多少网站优化如何让内链呈现更自然