PHPのインストールにFFI拡張機能が有効になっていることを確認してください。 php.iniファイルを変更して、次の構成を追加できます。
ffi.enable=1
次に、たとえば、C構造の定義が必要です。
typedef struct {
int id;
float value;
} Item;
この構造をPHPのC宣言を通して定義し、一連の構造を操作します。
$ffi = FFI::cdef("
typedef struct {
int id;
float value;
} Item;
void *memcpy(void *dest, const void *src, size_t n);
", "libc.so.6"); // Linux 下 libc パス,Windows に変更する必要がある場合があります "msvcrt.dll"
一連の構造を作成し、いくつかの要素を初期化します。
$length = 3;
$items1 = $ffi->new("Item[$length]");
$items1[0]->id = 1;
$items1[0]->value = 3.14;
$items1[1]->id = 2;
$items1[1]->value = 2.71;
$items1[2]->id = 3;
$items1[2]->value = 1.62;
最初にターゲット配列にメモリを割り当て、次にメモリコピーにMemcpyを使用する必要があります。
$items2 = $ffi->new("Item[$length]");
// バイトの総数を計算します:各構造のサイズに数字を掛けます
$size = FFI::sizeof($items1);
// 使用 memcpy メモリをコピーします
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);
for ($i = 0; $i < $length; $i++) {
echo "Item {$i}:\n";
echo " ID: " . $items2[$i]->id . "\n";
echo " Value: " . $items2[$i]->value . "\n";
}
出力は次のようにする必要があります。
Item 0:
ID: 1
Value: 3.14
Item 1:
ID: 2
Value: 2.71
Item 2:
ID: 3
Value: 1.62
Memcpyはバイトでコピーされ、ターゲットメモリ領域が十分なスペースに割り当てられていることを確認します。
ffi :: sizeofは、バイトサイズを配列で占有するために安全に使用できます。
スクリプト呼び出しでPHP FFIコードを実行する場合は、コマンドラインでPHP -DFFI.ENABLE = 1 yourfile.phpを使用することを忘れないでください。
一部のプラットフォーム(MacosやWindowsなど)では、C標準ライブラリファイル名は異なり、 CDEFのライブラリ名は実際のパスに従って変更する必要があります。