Aktueller Standort: Startseite> Neueste Artikel> FFI :: MEMCPY-Implementierung des Kopierens von Coping Coping-Struktur-Arrays in PHP

FFI :: MEMCPY-Implementierung des Kopierens von Coping Coping-Struktur-Arrays in PHP

gitbox 2025-06-06

1. Umweltvorbereitung

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.


2. Verwenden Sie FFI, um die Struktur in PHP zu deklarieren

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

3. Erstellen Sie ein Strukturarray und initialisieren Sie es

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;

4. Verwenden Sie FFI :: memcpy, um Strukturarrays zu kopieren

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

V. Überprüfen Sie die Kopierergebnisse

 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

6. Dinge zu beachten

  1. Memcpy wird von Bytes kopiert, um sicherzustellen, dass der Zielspeicherbereich ausreichend Platz zugewiesen wurde.

  2. FFI :: SizeOf kann sicher verwendet werden, um die Bytegröße von einem Array einzuschätzen.

  3. 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.

  4. 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.