ircmaxell/ffime

使用FFI(外部函数接口)使工作变得简单

dev-master 2024-01-02 20:37 UTC

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');