
利用FFI在PHP中调用C/Go SO库
以往在PHP中调用外部语言编写的SO库,需要编写PHP扩展。但从PHP 7.4版本开始,借助FFI(Foreign Function Interface),无需扩展即可直接调用SO库。
此方法的步骤如下:
-
创建FFI绑定: 使用
FFI::cdef创建C数据结构的FFI绑定,并传入SO库路径。 -
创建C数据结构: 使用
FFI::new创建一个C数据结构实例,作为函数参数或返回值。 -
调用C函数: 通过FFI接口调用C函数,并传入C数据结构实例的地址(
FFI::addr)。 - 访问C数据: 根据需要访问C数据结构的字段,或将整个结构转换为PHP值。
示例:
立即学习“PHP免费学习笔记(深入)”;
假设有一个C函数:
int get_timestamp(struct timeval *tv) {
gettimeofday(tv, NULL);
return tv->tv_sec;
}
使用FFI在PHP中调用该函数:
new("timeval");
$timestamp = $ffi->get_timestamp(FFI::addr($tv));
echo $tv->tv_sec . " " . $tv->tv_usec . PHP_EOL;
?>
重要提示:
FFI目前仍处于实验阶段,稳定性有待进一步提升。











