ircmaxell / ffime
使用FFI(外部函数接口)使工作变得简单
dev-master
2024-01-02 20:37 UTC
Requires
- php: >=8.0
- ircmaxell/php-c-parser: dev-master
- ircmaxell/php-object-symbolresolver: dev-master
Requires (Dev)
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-08-31 00:27:57 UTC
README
这是一个PHP FFI扩展的包装库。
您提供共享对象和一个或多个头文件,它会自动为您生成C结构体和函数签名(就像在C中做一样)。然后,它为所有C结构体和函数提供包装类,以提供完全类型化的体验。
用法
目前有两种操作模式,一种是“内联”模式
$libc = (new FFIMe\FFIMe(FFIMe\FFIMe::LIBC)) ->include("stdio.h") ->build(); $libc->printf("test\n");
和代码生成模式
(new FFIMe\FFIMe(FFIMe\FFIMe::LIBC)) ->include("stdio.h") ->include("other.h") ->codeGen('full\\classname', 'path/to/file.php'); require 'path/to/file.php'; $libc = full\classname::ffi(); $libc->printf("test\n");
代码生成模式旨在在生产中使用,您可以在构建步骤中生成代码并将其与库一起分发。
现在这应该适用于大多数头文件。查看一些代码,特别是编译器,有一些必要的硬编码。因此,我预计不是每个文件都能立即工作。如果您发现某个头文件不工作,请打开一个bug报告,我们将进行检查。
查看示例;
精简
为大型项目生成FFI可能会导致代码文件达到数十万甚至数百万行,尽管实际上只需要几百或几千行。这可能会导致非微不足道的开销,该开销在开发后可以删除。
$ffi = (new FFIMe\FFIMe(FFIMe\FFIMe::LIBC)) ->include("stdio.h"); $ffi->codeGenWithInstrumentation('full\\classname', 'path/to/file.php'); // Run some code providing 100% coverage of all code using FFI (new PHPUnit\TextUI\Command)->run([$argv[0], "test"], false); $ffi->codeGen('full\\classname', 'path/to/file.php');