Position actuelle: Accueil> Derniers articles> FFI :: MEMCPY Implémentation de la copie des tableaux de structure de langue C dans PHP

FFI :: MEMCPY Implémentation de la copie des tableaux de structure de langue C dans PHP

gitbox 2025-06-06

1. Préparation environnementale

Assurez-vous que votre installation PHP a une extension FFI activée. Vous pouvez modifier le fichier php.ini et ajouter la configuration suivante:

 ffi.enable=1

Ensuite, nous avons besoin d'une définition de la structure C, par exemple:

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

Nous définirons cette structure par le biais de la déclaration C en PHP et exploiterons un tableau de structures.


2. Utilisez FFI pour déclarer la structure en 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 Vers le bas libc Le chemin,Windows Vers le bas可能需要改为 "msvcrt.dll"

3. Créez un tableau de structure et initialisez-le

Nous créons un tableau de structures et initialisons plusieurs éléments.

 $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. Utilisez FFI :: MEMCPY pour copier les tableaux de structure

Nous devons d'abord allouer de la mémoire pour le tableau cible, puis utiliser MEMCPY pour la copie de la mémoire.

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

// Calculez le nombre total d'octets:La taille de chaque structure est multipliée par le nombre
$size = FFI::sizeof($items1);

// utiliser memcpy Copier la mémoire
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);

V. Vérifiez les résultats de la copie

 for ($i = 0; $i < $length; $i++) {
    echo "Item {$i}:\n";
    echo "  ID: " . $items2[$i]->id . "\n";
    echo "  Value: " . $items2[$i]->value . "\n";
}

La sortie doit être la suivante:

 Item 0:
  ID: 1
  Value: 3.14
Item 1:
  ID: 2
  Value: 2.71
Item 2:
  ID: 3
  Value: 1.62

6. Choses à noter

  1. MEMCPY est copié par des octets pour s'assurer que la zone de mémoire cible a été suffisamment allouée dans l'espace;

  2. Ffi :: Sizeof peut être utilisé en toute sécurité pour obtenir la taille des octets occupée par un tableau;

  3. Si vous souhaitez exécuter le code FFI PHP via des appels de script, n'oubliez pas d'utiliser php -dffi.enable = 1 yourfile.php sur la ligne de commande;

  4. Sur certaines plates-formes (telles que MacOS ou Windows), les noms de fichiers de bibliothèque standard C sont différents et le nom de la bibliothèque dans CDEF doit être modifié en fonction du chemin réel.