ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 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` ```ts ./configure --prefix=/usr/local/php-8.3.1 --with-ffi ``` ### 编译扩展开启`FFI` 下载 ```ts wget https://www.php.net/distributions/php-8.3.1.tar.gz ``` 解压 ``` 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` 配置文件 ```ts /usr/local/php-8.3.1/bin/phpize Configuring for: PHP Api Version: 20230831 Zend Module Api No: 20230831 Zend Extension Api No: 420230831 ``` 指定配置文件 ```ts sudo ./configure --with-php-config=/usr/local/php-8.3.1/bin/php-config ``` 编译 ```ts 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'. ``` 安装 ```ts sudo make install Installing shared extensions: /usr/local/php-8.3.1/lib/php/extensions/no-debug-non-zts-20230831/ ``` php.ini 开启扩展 ```ts extension=ffi ffi.enable=true ``` 检查是否安装成功 ```ts /usr/local/php-8.3.1/bin/php -m | grep FFI FFI ``` ## 基础使用 ``` <?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"); ``` 执行以上示例会输出: ``` /usr/local/php-8.3.1/bin/php ffi.php Hello world! ```