現在の位置: ホーム> 最新記事一覧> FFI :: PHPでのC言語構造配列のコピーのMEMCPY実装

FFI :: PHPでのC言語構造配列のコピーのMEMCPY実装

gitbox 2025-06-06

1。環境準備

PHPのインストールにFFI拡張機能が有効になっていることを確認してください。 php.iniファイルを変更して、次の構成を追加できます。

 ffi.enable=1

次に、たとえば、C構造の定義が必要です。

 typedef struct {
    int id;
    float value;
} Item;

この構造をPHPのC宣言を通して定義し、一連の構造を操作します。


2。FFIを使用して、PHPで構造を宣言します

$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"

3.構造配列を作成し、初期化します

一連の構造を作成し、いくつかの要素を初期化します。

 $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;

4。FFI:: MEMCPYを使用して、構造配列をコピーします

最初にターゲット配列にメモリを割り当て、次にメモリコピーにMemcpyを使用する必要があります。

 $items2 = $ffi->new("Item[$length]");

// バイトの総数を計算します:各構造のサイズに数字を掛けます
$size = FFI::sizeof($items1);

// 使用 memcpy メモリをコピーします
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);

V.コピーの結果を確認します

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

6。注意すべきこと

  1. Memcpyはバイトでコピーされ、ターゲットメモリ領域が十分なスペースに割り当てられていることを確認します。

  2. ffi :: sizeofは、バイトサイズを配列で占有するために安全に使用できます。

  3. スクリプト呼び出しでPHP FFIコードを実行する場合は、コマンドラインでPHP -DFFI.ENABLE = 1 yourfile.phpを使用することを忘れないでください。

  4. 一部のプラットフォーム(MacosやWindowsなど)では、C標準ライブラリファイル名は異なり、 CDEFのライブラリ名は実際のパスに従って変更する必要があります。