當前位置: 首頁> 最新文章列表> FFI::memcpy 在PHP 中復制C 語言結構體數組的實現

FFI::memcpy 在PHP 中復制C 語言結構體數組的實現

gitbox 2025-06-06

一、環境準備

確保你的PHP 安裝啟用了FFI 擴展。可以通過修改php.ini文件,添加如下配置:

 ffi.enable=1

接著,我們需要一個C 語言結構體定義,例如:

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

我們將在PHP 中通過C 的聲明來定義這個結構體,並操作一個結構體數組。


二、在PHP 中使用FFI 聲明結構體

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

四、使用FFI::memcpy 實現結構體數組的複制

我們需要先為目標數組分配內存,再用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

六、注意事項

  1. memcpy是按字節複製,確保目標內存區域已經分配好足夠的空間;

  2. FFI::sizeof可以安全地用於獲取數組所佔字節大小;

  3. 如果你想通過腳本調用的方式運行PHP FFI 代碼,記得在命令行中使用php -dffi.enable=1 yourfile.php

  4. 在部分平台(如macOS 或Windows)上,C 標準庫文件名不同,需要根據實際路徑修改cdef中的庫名。