加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

编译PHP扩展的技巧

发布时间:2022-07-21 13:10:54 所属栏目:PHP教程 来源:互联网
导读:构建PHP扩展 你已经知道如何去编译PHP本身,下一步我们将编译外部扩展。我们将讨论扩展的构建过程和可用的编译选项。 载入共享扩展 在前一个章节你已经知道,PHP 扩展既能构建成静态库也可以构建成动态库(.so)。大多数静态库是与 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
 
 
  ~/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 一样,例如:
 
  首先,你要把扩展的源代码放到 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。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读