FFI 扩展仅支持 PHP 7.4+,PHP 7.3 及更早版本源码中无 ext/ffi 目录,无法通过编译启用;必须升级至 PHP 7.4 或更高版本,并正确配置 libffi 依赖、--enable-ffi 编译选项及 php.ini 中 extension=ffi 和 ffi.enable=true(8.1+ 支持 true,7.4 仅支持 preload)。

FFI 扩展从 PHP 7.4 开始才正式引入,PHP 7.3 及更早版本压根没有这个扩展的源码,所以无论你怎么编译安装,都不可能在 PHP 7.3 中启用或加载 FFI。
FFI 是 PHP 7.4+ 的原生扩展,不是可选模块
-
FFI不是像fileinfo或curl那样可以后期编译进旧版 PHP 的独立扩展; - 它深度依赖 PHP 7.4 新增的 Zend 引擎机制(如
opcache.preload支持、新的类型系统、FFI 内存管理器等); - PHP 7.3 的源码树里根本不存在
ext/ffi目录,./configure --enable-ffi会直接报错或被忽略。
为什么有人以为“能编译进去”?
常见误解来源:
- 看到 Dockerfile 里写
--enable-ffi,误以为这是通用开关; - 在 PHP 7.3 源码中搜索关键词
ffi,发现零星注释或未启用的桩代码(其实是历史遗留或条件宏占位),误判为“有基础”; - 把
libffi-dev系统库当成 PHP 扩展本身——它只是 FFI 运行时依赖,不是 PHP 功能。
你装了 libffi-dev,PHP 7.3 依然无法识别 FFI::cdef(),调用会直接报 Fatal error: Uncaught Error: Class 'FFI' not found。
如果你必须用 FFI,唯一可行路径是升级 PHP
- 切换到 PHP 7.4 或更高版本(推荐 8.1+,因 7.4 的
ffi.enable默认为preload,Web 请求中默认禁用); - 编译时确保:
-
libffi-dev(Debian/Ubuntu)或libffi-devel(CentOS/RHEL)已安装; -
./configure加上--enable-ffi; -
php.ini中启用:extension=ffi和ffi.enable=true(注意:PHP 8.1+ 允许设为true,而 7.4 仅支持preload或false)。
-
最容易被忽略的一点
即使你用 PHP 8.2 成功启用了 FFI,在 Web SAPI(如 Apache/FPM)中调用 FFI::cdef() 加载 DLL 或 so 文件,仍可能因 opcache.preload 未配置、或函数签名不匹配、或路径权限受限而静默失败——错误日志里往往只有一行 Segmentation fault 或空响应,而不是清晰的 PHP 异常。
立即学习“PHP免费学习笔记(深入)”;
别只盯着“能不能装”,得盯住“在哪能用、怎么安全用”。



















