PHP拓展怎么安装_源码编译装拓展要先装什么软件包【指南】

3次阅读

编译 php 扩展前必须安装三类依赖:PHP 开发包(php-dev 或 php-devel)、构建工具(autoconf/automake/libtool)及扩展特有库(如 libhiredis-dev);phpize 用于生成匹配目标 PHP 版本的 configure 脚本,需确保其 PHP API 版本与 php -i 一致;configure 须指定 –with-php-config 和必要路径参数;.so 文件须放至 extension_dir 并在 php.ini 中正确启用,注意加载顺序与 ABI 兼容性。

PHP拓展怎么安装_源码编译装拓展要先装什么软件包【指南】

源码编译 PHP 扩展前必须装哪些依赖

缺依赖是编译失败最常见原因,不是“找不到 phpize”就是“configure: Error: not found”,本质是开发头文件和构建工具没到位。

以主流 linux 发行版为例,核心要装三类:

  • php-devdebian/ubuntu)或 php-develcentos/RHEL)——提供 phpizephp-config 和 PHP 内部头文件(如 php.h),没它连第一步都走不了
  • autoconfautomakelibtool——PHP 扩展 configure 脚本由 autoconf 生成,缺它们会报 autoreconf: command not found
  • 对应扩展的外部依赖,比如编译 redis 扩展需 libhiredis-dev(Ubuntu)或 hiredis-devel(CentOS);编译 gdlibpng-devlibjpeg-dev

phpize 是什么,为什么每次都要用它

phpize 不是编译器,而是为扩展生成 configure 脚本的“预处理器”。它读取当前 PHP 安装路径、ABI 版本、扩展目录位置,确保后续 ./configure 能对上号。

常见误区:用系统自带 PHP 的 phpize 去编译为另一个 PHP(比如自己编译的 PHP 7.4)写的扩展,结果 make installphp -m 看不见,或者启动时报 undefined symbol。解决方法只有一个:用目标 PHP 对应的 phpize,通常在 /path/to/php/bin/phpize

立即学习PHP免费学习笔记(深入)”;

验证方式:phpize --version 输出的 PHP API 版本(如 20190902)必须和 php -i | grep "PHP API" 一致。

configure 参数怎么选才不翻车

多数扩展默认只启核心功能,但有些选项一漏就直接编译失败,或运行时报错。

  • --with-php-config=/path/to/php/bin/php-config:强制指定配置工具路径,避免找错 PHP 安装;不加可能误用系统 PHP 的头文件
  • --enable-xxx 类开关(如 --enable-opcache)一般不用手动开,因为 opcache 是内建模块,源码里已存在;但像 --enable-redis-igbinary 这种需额外支持的就得显式打开
  • 路径类参数如 --with-openssl-dir=/usr/local/ssl,当 OpenSSL 不在标准路径时必须指定,否则 configure 通过但运行时报 SSL routines:OPENSSL_internal:UNKNOWN_SSL_PROTOCOL

编译完的 .so 文件放哪、怎么加载

执行 make install 后,最终的 .so 文件默认放在 extension_dir 指向的目录(可通过 php -i | grep extension_dir 查)。但只是放对位置还不够:

  • 确认 php.ini 中已启用 extension_dir,且值正确(绝对路径,末尾不加斜杠)
  • php.ini 里加一行 extension=redis.so(注意不是完整路径,除非你用 extension=/full/path/redis.so
  • 如果扩展依赖其他 so(如 igbinary.so 必须在 redis.so 前加载),顺序不能错;ini 中靠前的先加载
  • 改完 ini 必须重启 PHP-FPM 或 apachephp -m 只反映 CLI SAPI,不能代表 Web 环境

最容易被忽略的是 ABI 兼容性:同一个 .so 文件不能跨 PHP 主版本使用(如 PHP 8.1 编译的 mongodb.so 无法在 PHP 8.2 下加载),错误信息通常是 undefined symbol: zend_new_interned_string 这类内部函数名不匹配。

text=ZqhQzanResources