Heim  >  Artikel  >  Backend-Entwicklung  >  So rufen Sie eine C-Funktion in PHP auf

So rufen Sie eine C-Funktion in PHP auf

autoload
autoloadOriginal
2021-04-06 15:41:192538Durchsuche

So rufen Sie eine C-Funktion in PHP auf

FFI bietet Hochsprachen für den direkten gegenseitigen Aufruf, und für PHP ermöglicht uns FFI den bequemen Aufruf von Verschiedene in der C-Sprache geschriebene Bibliotheken. Tatsächlich handelt es sich bei einer großen Anzahl vorhandener PHP-Erweiterungen um Pakete einiger vorhandener C-Bibliotheken, wie beispielsweise der häufig verwendeten mysqli, curl, gettext, usw., PECL. Wenn wir traditionell die Funktionen einiger vorhandener C-Sprachbibliotheken nutzen müssen, müssen wir wrapper in der C-Sprache schreiben und sie in Erweiterungen packen Ich muss lernen, wie man die Erweiterung von PHP schreibt. Natürlich gibt es jetzt einige praktische Methoden, wie zum Beispiel Zephir., aber es fallen immer noch einige Lernkosten an Nach FFI können wir Funktionen in Bibliotheken, die in der Sprache C geschrieben sind, in PHP-Skripten direkt aufrufen. Im Laufe der jahrzehntelangen Geschichte der C-Sprache wurde eine große Anzahl hervorragender Bibliotheken angesammelt, mit denen wir diese riesige Ressource direkt nutzen können.  FFI提供了高级语言直接的互相调用,而对于PHP来说,FFI让我们可以方便的调用C语言写的各种库。其实现有大量的PHP扩展是对一些已有的C库的包装,比如常用的mysqli, curl, gettext等,PECL中也有大量的类似扩展。传统的方式,当我们需要用一些已有的C语言的库的能力的时候,我们需要用C语言写wrapper,把他们包装成扩展,这个过程中就需要大家去学习PHP的扩展怎么写,当然现在也有一些方便的方式,比如Zephir. 但总还是有一些学习成本的,而有了FFI以后,我们就可以直接在PHP脚本中调用C语言写的库中的函数了。而C语言几十年的历史中,积累了大量的优秀的库,FFI直接让我们可以方便的享受这个庞大的资源了。

    注意:FFI应在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

    创建了两个对象,分别调用了 Cprintf()pow() 函数。FFI::cdef() 是用于创建一个 FFI 对象,它接收两个参数,一个是包含常规C语言(类型、结构、函数、变量等)声明序列的字符串。实际上,这个字符串可以从C头文件复制粘贴。而另一个参数则是要加载并定义链接的共享库文件的名称。也就是我们需要的 .dll .so 文件,它与我们声明字符串是对应的,比如在 libc.so.6 中并没有 pow() 这类的计算函数,所以我们就要找到 math 相关的 C 语言计算函数库。

定义变量和数组

// 创建一个 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),内存大小

    使用 FFI::new() 函数来创建一个 C 的数据结构,也就是变量声明,这些变量的内容将保存在 cdata 属性中。而数组则直接就可以操作这个函数的返回值。当然,当我们要结束使用的时候,还是需要使用 FFI::free() 来释放变量的,就和 C

Hinweis: FFI sollte nach der Version PHP7.4 verwendet werden.

rrreee Zwei Objekte wurden erstellt und jeweils von <code>C aufgerufen printf()- und pow()-Funktionen. FFI::cdef() wird verwendet, um ein FFI-Objekt zu erstellen. Es empfängt zwei Parameter, von denen einer die reguläre C-Sprache (Typ, Struktur) enthält , Funktion, Variable usw.) Zeichenfolge, die die Sequenz deklariert. Tatsächlich kann diese Zeichenfolge aus der C-Header-Datei kopiert und eingefügt werden. Der andere Parameter ist der Name der gemeinsam genutzten Bibliotheksdatei, die geladen und für die Verknüpfung definiert werden soll. Das ist die Datei .dll oder .so, die wir benötigen, die unserer Deklarationszeichenfolge entspricht, wie sie beispielsweise in libc.so.6 vorhanden ist Keine Berechnungsfunktion wie pow() in , daher müssen wir die C-Sprachberechnungsfunktionsbibliothek finden, die sich auf math bezieht. Variablen und Arrays definierenrrreee Verwenden Sie die Funktion FFI::new() , um ein C Datenstruktur, d. h. Variablendeklaration, der Inhalt dieser Variablen wird im Attribut cdata gespeichert. Das Array kann direkt mit dem Rückgabewert dieser Funktion arbeiten. Wenn wir die Verwendung beenden möchten, müssen wir natürlich immer noch FFI::free() verwenden, um die Variablen freizugeben, genau wie bei der Entwicklung der C-Sprache.

🎜🎜Empfohlen: 🎜"🎜Zusammenfassung der PHP-Interviewfragen 2021 (Sammlung)🎜" "🎜php-Video-Tutorial🎜"🎜

Das obige ist der detaillierte Inhalt vonSo rufen Sie eine C-Funktion in PHP auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn