Stellen Sie sicher, dass Ihre PHP -Installation die FFI -Erweiterung aktiviert hat. Sie können die Php.ini -Datei ändern und die folgende Konfiguration hinzufügen:
ffi.enable=1
Als nächstes brauchen wir eine C -Strukturdefinition, zum Beispiel:
typedef struct {
int id;
float value;
} Item;
Wir werden diese Struktur durch die C -Erklärung in PHP definieren und eine Reihe von Strukturen bedienen.
$ffi = FFI::cdef("
typedef struct {
int id;
float value;
} Item;
void *memcpy(void *dest, const void *src, size_t n);
", "libc.so.6"); // Linux Runter libc Der Weg,Windows Runter可能需要改为 "msvcrt.dll"
Wir erstellen eine Reihe von Strukturen und initialisieren mehrere Elemente.
$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;
Wir müssen zuerst Speicher für das Zielarray zuweisen und dann MEMCPY für das Speicherkopieren verwenden.
$items2 = $ffi->new("Item[$length]");
// Berechnen Sie die Gesamtzahl der Bytes:Die Größe jeder Struktur wird mit der Zahl multipliziert
$size = FFI::sizeof($items1);
// verwenden memcpy Speicher kopieren
$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";
}
Die Ausgabe sollte wie folgt sein:
Item 0:
ID: 1
Value: 3.14
Item 1:
ID: 2
Value: 2.71
Item 2:
ID: 3
Value: 1.62
Memcpy wird von Bytes kopiert, um sicherzustellen, dass der Zielspeicherbereich ausreichend Platz zugewiesen wurde.
FFI :: SizeOf kann sicher verwendet werden, um die Bytegröße von einem Array einzuschätzen.
Wenn Sie den PHP -FFI -Code über Skriptaufrufe ausführen möchten, denken Sie daran , PHP -Dffi.Enable = 1 yourfile.php in der Befehlszeile zu verwenden.
Auf einigen Plattformen (z. B. MacOS oder Windows) unterscheiden sich die C -Standardbibliotheks -Dateinamen der C -Standard -Bibliothek und der Bibliotheksname in CDEF muss entsprechend dem tatsächlichen Pfad geändert werden.