Maison  >  Article  >  développement back-end  >  Comment appeler une fonction C en PHP

Comment appeler une fonction C en PHP

autoload
autoloadoriginal
2021-04-06 15:41:192621parcourir

Comment appeler une fonction C en PHP

 FFI fournit des langages de haut niveau pour s'appeler directement, et pour PHP, FFI nous permet d'appeler facilement diverses bibliothèques écrites dans le C langue . En fait, il existe un grand nombre d'extensions PHP qui sont des packages de certaines bibliothèques C existantes, telles que les mysqli, curl, gettext couramment utilisées. Il existe également un grand nombre d'extensions similaires dans PECL. Traditionnellement, lorsque nous devons utiliser les capacités de certaines C bibliothèques de langage existantes, nous devons écrire wrapper en langage C et les empaqueter dans des extensions. Dans ce processus, tout le monde doit apprendre PHP Bien sûr, il y en a. Il existe des moyens pratiques d'écrire des extensions, telles que Zephir., mais il y a quand même un certain coût d'apprentissage. Avec FFI, nous pouvons appeler directement le langage PHP dans le script C pour écrire une fonction dans la bibliothèque. Au cours des décennies d'histoire de la langue C, un grand nombre d'excellentes bibliothèques ont été accumulées FFI nous permet directement de profiter facilement de cette énorme ressource.

Remarque : FFI doit être utilisé après que la version PHP7.4

// 创建一个 FFI 对象,加载 libc 并且导入 printf 函数
$ffi_printf = FFI::cdef(
    "int printf(const char *format, ...);", // C 的定义规则
    "libc.so.6"); // 指定 libc 库
// 调用 C 的 printf 函数
$ffi_printf->printf("Hello %s!\n", "world"); // Hello World

// 加载 math 并且导入 pow 函数
$ffi_pow = FFI::cdef(
    "double pow(double x, double y);", 
    "libboost_math_c99.so.1.66.0");
// 这里调用的是 C 的 pow 函数,不是 PHP 自己的
echo $ffi_pow->pow(2,3), PHP_EOL; // 8

a créé deux objets et a appelé les fonctions C et printf() de pow() respectivement. FFI::cdef() est utilisé pour créer un objet FFI , qui reçoit deux paramètres, l'un est une chaîne contenant la séquence de déclaration régulière C语言 (type, structure, fonction, variable, etc.). En fait, cette chaîne peut être copiée-collée à partir du fichier d'en-tête C. L'autre paramètre est le nom du fichier de bibliothèque partagée à charger et à définir pour la liaison. C'est le fichier .dll ou .so dont nous avons besoin, qui correspond à la chaîne que nous déclarons. Par exemple, il n'y a pas de fonction de calcul telle que libc.so.6 dans pow(), il faut donc trouver le math associé. La bibliothèque de fonctions de calcul du langage C.

Définir des variables et des tableaux

// 创建一个 int 变量
$x = FFI::new("int");
var_dump($x->cdata); // int(0)

// 为变量赋值
$x->cdata = 5;
var_dump($x->cdata); // int(5)

// 计算变量
$x->cdata += 2;
var_dump($x->cdata); // int(7)


// 结合上面的两个 FFI 对象操作

echo "pow value:", $ffi_pow->pow($x->cdata, 3), PHP_EOL;
// pow value:343
$ffi_printf->printf("Int Pow value is : %f\n", $ffi_pow->pow($x->cdata, 3));
// Int Pow value is : 343.000000


// 创建一个数组
$a = FFI::new("long[1024]");
// 为数组赋值
for ($i = 0; $i < count($a); $i++) {
    $a[$i] = $i;
}
var_dump($a[25]); // int(25)

$sum = 0;
foreach ($a as $n) {
    $sum += $n;
}
var_dump($sum); // int(523776)

var_dump(count($a)); // int(1024) 数组长度
var_dump(FFI::sizeof($a)); // int(8192),内存大小

Utilisez la fonction FFI::new() pour créer une structure de données C , qui est une déclaration de variable. Ces Le contenu de la variable sera enregistré dans l'attribut cdata . Le tableau peut opérer directement sur la valeur de retour de cette fonction. Bien sûr, lorsque nous voulons mettre fin à l'utilisation, nous devons toujours utiliser FFI::free() pour libérer des variables, tout comme C le développement du langage.

Recommandé : "Résumé des questions d'entretien PHP 2021 (collection)" "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn