確保你的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中的庫名。