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.
$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"
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;
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);
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
MEMCPY est copié par des octets pour s'assurer que la zone de mémoire cible a été suffisamment allouée dans l'espace;
Ffi :: Sizeof peut être utilisé en toute sécurité pour obtenir la taille des octets occupée par un tableau;
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;
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.