FFI
PHP Foreign Function Interface (FFI) 是 PHP 7.4 引入的一个新特性,它允许 PHP 代码调用 C 语言的库函数,而无需编写额外的扩展。
FFI 使得 PHP 能够直接与其他编程语言编写的库进行交互,从而扩展其功能。这使得PHP开发人员能够轻松利用现有的C库,如加密算法、操作系统API等,从而实现以前只能在其他低级语言中完成的任务。
主要用途
- 调用系统级库:PHP FFI 可以用于调用系统级的 C 库,如 libc(标准 C 库),以执行底层系统操作,如内存管理、文件操作等。
- 使用高性能库:PHP FFI 可以让你使用 C/C 编写的高性能库,如图像处理、加密、数据库等,从而提高 PHP 应用程序的性能。
- 避免编写扩展:在以前,如果你想在 PHP 中使用某个 C/C 库,你通常需要编写一个 PHP 扩展。现在,使用 FFI,你可以直接调用这些库,而无需编写和维护扩展。
两种启用方式
- 编译安装PHP的时候开启
FFI
扩展--with-ffi
- 已经安装PHP,通过扩展来编译安装
FFI
扩展
编译开启FFI
代码语言:javascript复制./configure --prefix=/usr/local/php-8.3.1 --with-ffi
编译扩展开启FFI
下载
代码语言:javascript复制wget https://www.php.net/distributions/php-8.3.1.tar.gz
解压
代码语言:javascript复制tar -zxvf php-8.3.1.tar.gz
cd php-8.3.1/
cd ext/ffi/
ls
config.m4 config.w32 CREDITS ffi_arginfo.h ffi.c ffi.g ffi_parser.c ffi.stub.php php_ffi.h tests
生成 ./configure
配置文件
/usr/local/php-8.3.1/bin/phpize
Configuring for:
PHP Api Version: 20230831
Zend Module Api No: 20230831
Zend Extension Api No: 420230831
指定配置文件
代码语言:javascript复制sudo ./configure --with-php-config=/usr/local/php-8.3.1/bin/php-config
编译
代码语言:javascript复制sudo make -j4
PATH="$PATH:/sbin" ldconfig -n /home/www/build/php-8.3.1/ext/ffi/modules
----------------------------------------------------------------------
Libraries have been installed in:
/home/www/build/php-8.3.1/ext/ffi/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
安装
代码语言:javascript复制sudo make install
Installing shared extensions: /usr/local/php-8.3.1/lib/php/extensions/no-debug-non-zts-20230831/
php.ini 开启扩展
代码语言:javascript复制extension=ffi
ffi.enable=true
检查是否安装成功
代码语言:javascript复制/usr/local/php-8.3.1/bin/php -m | grep FFI
FFI
基础使用
代码语言:javascript复制<?php
/**
* @desc 基础 FFI 用法
* @author Tinywan(ShaoBo Wan)
*/
declare(strict_types=1);
// 创建 FFI 对象,加载 libc 和输出函数 printf()
$ffi = FFI::cdef(
"int printf(const char *format, ...);", // 这是普遍的 C 声明
"libc.so.6");
// call C's printf()
$ffi->printf("Hello %s!n", "world");
执行以上示例会输出:
代码语言:javascript复制/usr/local/php-8.3.1/bin/php ffi.php
Hello world!