PHP如何编译启用 FFI 扩展

2024-08-27 20:01:42 浏览数 (2)

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 配置文件

代码语言:javascript复制
/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!

0 人点赞